Try our Chrome extension
Easily add the current web-page from your browser directly into your changedetection.io tool, more great features coming soon!Changedetection.io needs your support!
You can help us by supporting changedetection.io on these platforms;
- Rate us at AlternativeTo.net
- Star us on GitHub
- Follow us at Twitter/X
- G2 Software reviews
- Check us out on LinkedIn
- And tell your friends and colleagues :)
The more popular changedetection.io is, the more time we can dedicate to adding amazing features!
Many thanks :)
changedetection.io team
Notification debug log
- Sat 26 Sep 2026 09:31:21 AM - SENDING - [{"title": "ChangeDetection.io Notification - https://www.tnd.de/Site/1514", "body": "https://www.tnd.de/Site/1514 had a change.\n---\n<s> 2.37</s>\n<b> 2.35</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-26 09:30:59 UTC", "current_snapshot": " 2.35\n 1\n \u20ac\n Diesel", "diff": "@changed_PLACEMARKER_OPEN 2.37@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 2.35@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/f51fb228-02a0-4301-be31-75f38fa287e0", "raw_diff": "@changed_PLACEMARKER_OPEN 2.37@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 2.35@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1790415081.2790024, "prev_snapshot": " 2.37\n 1\n \u20ac\n Diesel", "preview_url": "https://changes.sotzny.net/preview/f51fb228-02a0-4301-be31-75f38fa287e0", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "f51fb228-02a0-4301-be31-75f38fa287e0", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "", "watch_title": "https://www.tnd.de/Site/1514", "watch_url": "https://www.tnd.de/Site/1514", "watch_open_url": "https://www.tnd.de/Site/1514", "watch_uuid": "f51fb228-02a0-4301-be31-75f38fa287e0", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/f51fb228-02a0-4301-be31-75f38fa287e0"}}]
- Fri 25 Sep 2026 08:31:28 AM - SENDING - [{"title": "ChangeDetection.io Notification - https://www.tnd.de/Site/1514", "body": "https://www.tnd.de/Site/1514 had a change.\n---\n<s> 2.38</s>\n<b> 2.37</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-25 08:31:06 UTC", "current_snapshot": " 2.37\n 1\n \u20ac\n Diesel", "diff": "@changed_PLACEMARKER_OPEN 2.38@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 2.37@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/f51fb228-02a0-4301-be31-75f38fa287e0", "raw_diff": "@changed_PLACEMARKER_OPEN 2.38@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 2.37@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1790325088.0858998, "prev_snapshot": " 2.38\n 1\n \u20ac\n Diesel", "preview_url": "https://changes.sotzny.net/preview/f51fb228-02a0-4301-be31-75f38fa287e0", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "f51fb228-02a0-4301-be31-75f38fa287e0", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "", "watch_title": "https://www.tnd.de/Site/1514", "watch_url": "https://www.tnd.de/Site/1514", "watch_open_url": "https://www.tnd.de/Site/1514", "watch_uuid": "f51fb228-02a0-4301-be31-75f38fa287e0", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/f51fb228-02a0-4301-be31-75f38fa287e0"}}]
- Fri 25 Sep 2026 03:16:29 AM - SENDING - [{"title": "ChangeDetection.io Notification - https://www.tnd.de/Site/1514", "body": "https://www.tnd.de/Site/1514 had a change.\n---\n<s> 2.39</s>\n<b> 2.38</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-25 03:16:07 UTC", "current_snapshot": " 2.38\n 1\n \u20ac\n Diesel", "diff": "@changed_PLACEMARKER_OPEN 2.39@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 2.38@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/f51fb228-02a0-4301-be31-75f38fa287e0", "raw_diff": "@changed_PLACEMARKER_OPEN 2.39@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 2.38@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1790306188.892238, "prev_snapshot": " 2.39\n 1\n \u20ac\n Diesel", "preview_url": "https://changes.sotzny.net/preview/f51fb228-02a0-4301-be31-75f38fa287e0", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "f51fb228-02a0-4301-be31-75f38fa287e0", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "", "watch_title": "https://www.tnd.de/Site/1514", "watch_url": "https://www.tnd.de/Site/1514", "watch_open_url": "https://www.tnd.de/Site/1514", "watch_uuid": "f51fb228-02a0-4301-be31-75f38fa287e0", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/f51fb228-02a0-4301-be31-75f38fa287e0"}}]
- Wed 23 Sep 2026 02:17:32 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://grundschule-nils-holgersson.de/", "body": "https://grundschule-nils-holgersson.de/ had a change.\n---\n<s> Align Text</s>\n<b> Text ausrichten</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-23 14:17:31 UTC", "current_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n Laden...\n * \n * \n * \n Startseite\n\n Herzlich Willkommen in unserer Grundschule Nils Holgersson Gro\u00dflehna\n\n 0\n Sch\u00fcler:innen\n 0\n Klassen\n 0\n Lehrkr\u00e4fte\n\n Aktuelle Termine\n\n keine kommenden Termine\n\n News aus der Grundschule\n\n * 5. September 2026\n\n Ein erlebnisreicher Schultag im ArkaZien-Park\n\n Am 1. September 2026 hie\u00df es f\u00fcr unsere gesamte Grundschule: Raus aus dem Klassenzimmer und auf nach Grimma! Gemeinsam machten sich alle Klassen mit vier gro\u00dfen Reisebussen auf den Weg in den ArkaZien-Park \u2013 [...]\n\n weiterlesen\n\n * 23. Juni 2026\n\n Schulanmeldung Schuljahr 2027/28\n\n Alle Kinder, die bis zum 30.06.2027 das 6. Lebensjahr vollenden, sind durch die Sorgeberechtigten bei der Grundschule ihres Schulbezirks anzumelden. Auch Kinder, die das sechste Lebensjahr sp\u00e4ter vollenden, k\u00f6nnen angemeldet werden. Eltern, die ihr Kind [...]\n\n weiterlesen\n\n * 14. Juni 2026\n\n Pokal und Medaillen f\u00fcr unser Floorballteam\n\n Am 12.06.2026 fand mit dem Grundschulcup im Floorball in der Stadthalle Markranst\u00e4dt der letzte Schulwettkampf des Schuljahres statt. Unsere Schule trat in der Wettkampfklasse V mit einem eingespielten Floorballteam aus den Klassen 3 und 4 [...]\n\n weiterlesen\n\n * 2. Juni 2026\n\n Buntes Kindertagsfest auf unserem Schulgel\u00e4nde\n\n Anl\u00e4sslich des internationalen Kindertages luden Hort und Schule zu einem fr\u00f6hlichen Kindertagsfest auf dem Schulgel\u00e4nde ein. Gemeinsam feierten die Kinder, ihre Eltern und alle Kollegen einen abwechslungsreichen Nachmittag mit vielen tollen Angeboten. F\u00fcr jede Menge [...]\n\n weiterlesen\n\n * 24. Mai 2026\n\n Tolle Leistungen beim Sportfest!\n\n Bei bestem Wetter verwandelte sich die Grundschule Nils Holgersson am 21.5.26 in eine gro\u00dfe Sport- und Bewegungslandschaft. Beim diesj\u00e4hrigen Sportfest konnten die Kinder der 3. und 4. Klassen ihr K\u00f6nnen im Dreikampf unter Beweis stellen. [...]\n\n weiterlesen\n\n * 23. Mai 2026\n\n 3. Platz im Floorballturnier\n\n Am Mittwoch, dem 20.05.2026, machten wir uns bereits zum dritten Mal mit dem Zug auf den Weg nach Wei\u00dfenfels, um am Floorball-Grundschulturnier teilzunehmen. Nach der Zugfahrt wurden wir vom UHC Sparkasse Wei\u00dfenfels mit Vereinsbussen zur [...]\n\n weiterlesen\n\n * 30. April 2026\n\n Unser 2. Spendenlauf 2026\n\n Unser 2. Spendenlauf fand am 30.04.26 bei strahlendem Sonnenschein statt. Mit viel Motivation und gro\u00dfem Ehrgeiz gingen alle Kinder an den Start und gaben ihr Bestes. Runde f\u00fcr Runde zeigten sie Ausdauer und jede Menge [...]\n\n weiterlesen\n\n * 23. April 2026\n\n Eine Reise in die Vergangenheit\n\n Am 22. April bekam unsere Klasse 4a besonderen Besuch: Herr H\u00f6lzel kam zu uns in die Schule. Er ist \u00fcber 100 Jahre alt und erz\u00e4hlte den Kindern viele spannende Geschichten aus seiner Schulzeit. Die Kinder [...]\n\n weiterlesen\n\n * 4. April 2026\n\n Wenn Wappen sprechen \u2013 eine besondere H\u00f6rausstellung der 3. Klassen\n\n Seit Beginn des Jahres haben die dritten Klassen mit viel Kreativit\u00e4t und Engagement an einem ganz besonderen Projekt gearbeitet: ihren eigenen Wappen. Zun\u00e4chst wurden die Wappen eigenst\u00e4ndig entworfen, ges\u00e4gt und gefeilt. Mit viel Geduld und [...]\n\n weiterlesen\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Text ausrichten\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/35bb6e45-cdfb-4987-bef5-d28b8045bb7f", "raw_diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1790173051.6087735, "prev_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n Laden...\n * \n * \n * \n Startseite\n\n Herzlich Willkommen in unserer Grundschule Nils Holgersson Gro\u00dflehna\n\n 0\n Sch\u00fcler:innen\n 0\n Klassen\n 0\n Lehrkr\u00e4fte\n\n Aktuelle Termine\n\n keine kommenden Termine\n\n News aus der Grundschule\n\n * 5. September 2026\n\n Ein erlebnisreicher Schultag im ArkaZien-Park\n\n Am 1. September 2026 hie\u00df es f\u00fcr unsere gesamte Grundschule: Raus aus dem Klassenzimmer und auf nach Grimma! Gemeinsam machten sich alle Klassen mit vier gro\u00dfen Reisebussen auf den Weg in den ArkaZien-Park \u2013 [...]\n\n weiterlesen\n\n * 23. Juni 2026\n\n Schulanmeldung Schuljahr 2027/28\n\n Alle Kinder, die bis zum 30.06.2027 das 6. Lebensjahr vollenden, sind durch die Sorgeberechtigten bei der Grundschule ihres Schulbezirks anzumelden. Auch Kinder, die das sechste Lebensjahr sp\u00e4ter vollenden, k\u00f6nnen angemeldet werden. Eltern, die ihr Kind [...]\n\n weiterlesen\n\n * 14. Juni 2026\n\n Pokal und Medaillen f\u00fcr unser Floorballteam\n\n Am 12.06.2026 fand mit dem Grundschulcup im Floorball in der Stadthalle Markranst\u00e4dt der letzte Schulwettkampf des Schuljahres statt. Unsere Schule trat in der Wettkampfklasse V mit einem eingespielten Floorballteam aus den Klassen 3 und 4 [...]\n\n weiterlesen\n\n * 2. Juni 2026\n\n Buntes Kindertagsfest auf unserem Schulgel\u00e4nde\n\n Anl\u00e4sslich des internationalen Kindertages luden Hort und Schule zu einem fr\u00f6hlichen Kindertagsfest auf dem Schulgel\u00e4nde ein. Gemeinsam feierten die Kinder, ihre Eltern und alle Kollegen einen abwechslungsreichen Nachmittag mit vielen tollen Angeboten. F\u00fcr jede Menge [...]\n\n weiterlesen\n\n * 24. Mai 2026\n\n Tolle Leistungen beim Sportfest!\n\n Bei bestem Wetter verwandelte sich die Grundschule Nils Holgersson am 21.5.26 in eine gro\u00dfe Sport- und Bewegungslandschaft. Beim diesj\u00e4hrigen Sportfest konnten die Kinder der 3. und 4. Klassen ihr K\u00f6nnen im Dreikampf unter Beweis stellen. [...]\n\n weiterlesen\n\n * 23. Mai 2026\n\n 3. Platz im Floorballturnier\n\n Am Mittwoch, dem 20.05.2026, machten wir uns bereits zum dritten Mal mit dem Zug auf den Weg nach Wei\u00dfenfels, um am Floorball-Grundschulturnier teilzunehmen. Nach der Zugfahrt wurden wir vom UHC Sparkasse Wei\u00dfenfels mit Vereinsbussen zur [...]\n\n weiterlesen\n\n * 30. April 2026\n\n Unser 2. Spendenlauf 2026\n\n Unser 2. Spendenlauf fand am 30.04.26 bei strahlendem Sonnenschein statt. Mit viel Motivation und gro\u00dfem Ehrgeiz gingen alle Kinder an den Start und gaben ihr Bestes. Runde f\u00fcr Runde zeigten sie Ausdauer und jede Menge [...]\n\n weiterlesen\n\n * 23. April 2026\n\n Eine Reise in die Vergangenheit\n\n Am 22. April bekam unsere Klasse 4a besonderen Besuch: Herr H\u00f6lzel kam zu uns in die Schule. Er ist \u00fcber 100 Jahre alt und erz\u00e4hlte den Kindern viele spannende Geschichten aus seiner Schulzeit. Die Kinder [...]\n\n weiterlesen\n\n * 4. April 2026\n\n Wenn Wappen sprechen \u2013 eine besondere H\u00f6rausstellung der 3. Klassen\n\n Seit Beginn des Jahres haben die dritten Klassen mit viel Kreativit\u00e4t und Engagement an einem ganz besonderen Projekt gearbeitet: ihren eigenen Wappen. Zun\u00e4chst wurden die Wappen eigenst\u00e4ndig entworfen, ges\u00e4gt und gefeilt. Mit viel Geduld und [...]\n\n weiterlesen\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Align Text\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "preview_url": "https://changes.sotzny.net/preview/35bb6e45-cdfb-4987-bef5-d28b8045bb7f", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "35bb6e45-cdfb-4987-bef5-d28b8045bb7f", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "Schule", "watch_title": "Startseite - Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna", "watch_url": "https://grundschule-nils-holgersson.de/", "watch_open_url": "https://grundschule-nils-holgersson.de/", "watch_uuid": "35bb6e45-cdfb-4987-bef5-d28b8045bb7f", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/35bb6e45-cdfb-4987-bef5-d28b8045bb7f"}}]
- Wed 23 Sep 2026 12:26:38 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://grundschule-nils-holgersson.de/ueber-uns/projekte/", "body": "https://grundschule-nils-holgersson.de/ueber-uns/projekte/ had a change.\n---\n<s> Align Text</s>\n<b> Text ausrichten</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-23 12:26:37 UTC", "current_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n F\u00f6rderprojekte\n\n Grundschule Gro\u00dflehna\n\n Startseite \u00bb \u00dcber uns \u00bb F\u00f6rderprojekte\n\n Unsere F\u00f6rderprojekte\n\n Mit den Mitgliedsbeitr\u00e4gen und Spenden unseres F\u00f6rdervereins m\u00f6chten wir Projekte unterst\u00fctzen, die \u00fcber den gew\u00f6hnlichen Schulalltag hinausgehen und unseren Kindern besondere gemeinsame Erfahrungen erm\u00f6glichen.\n\n Hier zeigen wir, was mit dieser Unterst\u00fctzung bereits m\u00f6glich geworden ist \u2013 und was wir f\u00fcr die Zukunft planen.\n \u2013\n\n .\n ArkaZien \u2013 Ein besonderer Tag f\u00fcr unsere ganze Schule\n\n Am 1. September 2026 machte sich unsere gesamte Grundschule gemeinsam auf den Weg in den ArkaZien-Park nach Grimma. Dort verbrachten unsere Sch\u00fclerinnen und Sch\u00fcler einen abwechslungsreichen Tag au\u00dferhalb des gewohnten Schulalltags und konnten gemeinsam entdecken, spielen und viele sch\u00f6ne Momente erleben.\n\n Unser F\u00f6rderverein unterst\u00fctzte den Ausflug finanziell und trug damit dazu bei, dieses besondere Erlebnis f\u00fcr alle Kinder unserer Schule zu erm\u00f6glichen.\n\n Unser n\u00e4chstes gro\u00dfes Ziel: Zirkusprojekt 2027\n\n F\u00fcr das Jahr 2027 ist erneut ein gro\u00dfes Zirkusprojekt an unserer Grundschule geplant. Bereits 2023 durften unsere Sch\u00fclerinnen und Sch\u00fcler selbst zu kleinen Artistinnen und Artisten werden und gemeinsam eine unvergessliche Zirkuswoche erleben.\n\n 2027 m\u00f6chten wir dieses besondere Erlebnis einer neuen Generation von Schulkindern erm\u00f6glichen. Ein solches Projekt ist jedoch nur mit gemeinsamer Unterst\u00fctzung m\u00f6glich.\n\n Mit Ihrer Mitgliedschaft oder einer Spende helfen Sie uns dabei, besondere Projekte wie dieses f\u00fcr unsere Kinder zu erm\u00f6glichen.\n\n Zirkusprojekt 2023 Grundschule Nils Holgersson Gro\u00dflehna\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Text ausrichten\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/c8e35c90-b618-48ec-af88-11d5b1bbd601", "raw_diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1790166397.9788175, "prev_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n F\u00f6rderprojekte\n\n Grundschule Gro\u00dflehna\n\n Startseite \u00bb \u00dcber uns \u00bb F\u00f6rderprojekte\n\n Unsere F\u00f6rderprojekte\n\n Mit den Mitgliedsbeitr\u00e4gen und Spenden unseres F\u00f6rdervereins m\u00f6chten wir Projekte unterst\u00fctzen, die \u00fcber den gew\u00f6hnlichen Schulalltag hinausgehen und unseren Kindern besondere gemeinsame Erfahrungen erm\u00f6glichen.\n\n Hier zeigen wir, was mit dieser Unterst\u00fctzung bereits m\u00f6glich geworden ist \u2013 und was wir f\u00fcr die Zukunft planen.\n \u2013\n\n .\n ArkaZien \u2013 Ein besonderer Tag f\u00fcr unsere ganze Schule\n\n Am 1. September 2026 machte sich unsere gesamte Grundschule gemeinsam auf den Weg in den ArkaZien-Park nach Grimma. Dort verbrachten unsere Sch\u00fclerinnen und Sch\u00fcler einen abwechslungsreichen Tag au\u00dferhalb des gewohnten Schulalltags und konnten gemeinsam entdecken, spielen und viele sch\u00f6ne Momente erleben.\n\n Unser F\u00f6rderverein unterst\u00fctzte den Ausflug finanziell und trug damit dazu bei, dieses besondere Erlebnis f\u00fcr alle Kinder unserer Schule zu erm\u00f6glichen.\n\n Unser n\u00e4chstes gro\u00dfes Ziel: Zirkusprojekt 2027\n\n F\u00fcr das Jahr 2027 ist erneut ein gro\u00dfes Zirkusprojekt an unserer Grundschule geplant. Bereits 2023 durften unsere Sch\u00fclerinnen und Sch\u00fcler selbst zu kleinen Artistinnen und Artisten werden und gemeinsam eine unvergessliche Zirkuswoche erleben.\n\n 2027 m\u00f6chten wir dieses besondere Erlebnis einer neuen Generation von Schulkindern erm\u00f6glichen. Ein solches Projekt ist jedoch nur mit gemeinsamer Unterst\u00fctzung m\u00f6glich.\n\n Mit Ihrer Mitgliedschaft oder einer Spende helfen Sie uns dabei, besondere Projekte wie dieses f\u00fcr unsere Kinder zu erm\u00f6glichen.\n\n Zirkusprojekt 2023 Grundschule Nils Holgersson Gro\u00dflehna\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Align Text\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "preview_url": "https://changes.sotzny.net/preview/c8e35c90-b618-48ec-af88-11d5b1bbd601", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "c8e35c90-b618-48ec-af88-11d5b1bbd601", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "Schule", "watch_title": "F\u00f6rderprojekte - Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna", "watch_url": "https://grundschule-nils-holgersson.de/ueber-uns/projekte/", "watch_open_url": "https://grundschule-nils-holgersson.de/ueber-uns/projekte/", "watch_uuid": "c8e35c90-b618-48ec-af88-11d5b1bbd601", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/c8e35c90-b618-48ec-af88-11d5b1bbd601"}}]
- Wed 23 Sep 2026 12:24:11 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://grundschule-nils-holgersson.de/ueber-uns/hausordnung/", "body": "https://grundschule-nils-holgersson.de/ueber-uns/hausordnung/ had a change.\n---\n<s> Align Text</s>\n<b> Text ausrichten</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-23 12:24:10 UTC", "current_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n Hausordnung\n\n Grundschule Gro\u00dflehna\n\n Startseite \u00bb \u00dcber uns \u00bb Hausordnung\n\n Ein respektvoller Umgang und die Einhaltung der Regeln sind uns wichtig\n\n Unsere Hausordnung\n\n Die Grundschule ist eine Schule in Tr\u00e4gerschaft der Stadt Markranst\u00e4dt.\n\n An 4 Tagen in der Woche (Mo-Do) werden Ganztagsangebote in gebundener Form (verbindlich f\u00fcr alle Sch\u00fcler) unterbreitet.\n\n Tagesstruktur:\n\n 0. Stunde 6.00 \u2013 7.30 Uhr Fr\u00fchhort\n\n 1. Stunde 7.45 \u2013 8.30 Uhr Fr\u00fchst\u00fcckspause\n\n 2. Stunde 8.45 \u2013 9.30 Uhr Hofpause\n\n 3. Stunde 9.50 \u2013 10.35 Uhr\n\n 4. Stunde 10.40 \u2013 11.25 Uhr Mittagspause\n\n 5. Stunde 12.25 \u2013 13.10 Uhr\n\n 6. Stunde 13.15 \u2013 14.00 Uhr\n\n Die Ganztagsangebote finden in der Regel bis 14.00 Uhr statt. Nach Unterrichtsschluss \u00fcbernehmen die Horterzieher die Kinder und betreuen sie je nach Vertrag bis l\u00e4ngstens 17.00 Uhr.\n\n Entschuldigungen: Die Eltern entschuldigen ihr Kind bis sp\u00e4testens 7.30 Uhr telefonisch. Die Entschuldigungen werden von der Schule an den Hort weitergeleitet. Eine schriftliche Entschuldigung ist immer unter Angabe des Grundes abzugeben.\n\n Sportunterricht: Vor dem Unterricht werden Gegenst\u00e4nde, die eine unfall-und/oder verletzungsfreie Durchf\u00fchrung des Unterrichts gef\u00e4hrden k\u00f6nnten, ausnahmslos abgelegt. Dazu geh\u00f6ren: Uhren, Schmuck (Ringe, Ketten, Armreifen, Armb\u00e4nder, Ohrringe, Ohrstecker, Piercings) sowie Schl\u00fcssel und G\u00fcrtel.\n\n Haare, die durch ihre L\u00e4nge eine Gefahr darstellen oder das Sichtfeld des Sch\u00fclers beeintr\u00e4chtigen, m\u00fcssen entsprechend fixiert werden. Langes Haar (ab Schulterl\u00e4nge) muss grunds\u00e4tzlich zusammengebunden sein.\n\n In der Turnhalle sind nur Turnschuhe aus Stoff oder Leder mit hellen Sohlen erlaubt, keine Stra\u00dfenschuhe! St\u00e4ndige Brillentr\u00e4ger tragen eine Sportbrille.\n\n Das Betreten der Turnhalle durch die Sch\u00fcler und die Benutzung der Sportger\u00e4te erfolgt nur auf Anweisung des Sportlehrers.\n\n Sportbefreiungen \u00fcber eine Woche erfordern eine \u00e4rztliche Bescheinigung. Eine Sportbefreiung l\u00e4nger als 4 Wochen erfordert ein amts\u00e4rztliches Gutachten.\n\n Freistellungen: In dringenden F\u00e4llen (nicht zur Urlaubsverl\u00e4ngerung) ist eine Freistellung m\u00f6glich, welche schriftlich beim Schulleiter beantragt wird.\n\n Allgemeine Regeln\n\n 1. Wir wollen uns in der Schule wohlf\u00fchlen, deshalb achten wir auf r\u00fccksichtsvolles Verhalten, gehen respektvoll miteinander um und gr\u00fc\u00dfen einander.\n 2. Wir erscheinen p\u00fcnktlich, bis sp\u00e4testens 7.30 Uhr zum Unterricht.\n 3. Wir packen in der Pause die Schulsachen f\u00fcr den n\u00e4chsten Unterricht aus.\n 4. Alle Dinge, die nicht zum Unterricht geh\u00f6ren, bleiben im Ranzen. Die Schule \u00fcbernimmt keine Haftung.\n 5. Wir nutzen die kleinen Pausen zur Erholung und zur Vorbereitung auf die n\u00e4chste Unterrichtsstunde. Daher bewegen wir uns in den Klassenr\u00e4umen und auf den Fluren leise und r\u00fccksichtsvoll und rennen nicht im Schulhaus.\n 6. Wir gehen m\u00f6glichst in der Pause auf die Toilette.\n 7. Wir achten in der Schule und im Hort auf Sauberkeit, Ordnung und Hygiene.\n 8. Wir sammeln den M\u00fcll in getrennten Beh\u00e4ltern \u2013 dadurch helfen wir der Umwelt.\n 9. Wir verlassen das Schulgeb\u00e4ude nur mit Erlaubnis einer Lehrerin oder Erzieherin.\n 10. Die Terrassent\u00fcren werden nur mit Erlaubnis einer Lehrerin oder Erzieherin ge\u00f6ffnet.\n 11. Wir verlassen bei Ert\u00f6nen des Alarmsignals sofort mit unserer Lehrerin/ Erzieherin ruhig und diszipliniert das Geb\u00e4ude entsprechend des Fluchtplanes.\n 12. Mobile Endger\u00e4te sind in der Schule nicht erlaubt.\n 13. Eltern ist es untersagt, fremde Kinder im Schulgel\u00e4nde oder -geb\u00e4ude zu ma\u00dfregeln.\n\n Verhalten im Au\u00dfenbereich\n\n 1. Wir schieben Fahrr\u00e4der oder Roller auf dem gesamten Gel\u00e4nde und stellen sie in den vorgesehenen St\u00e4ndern ab.\n 2. Wenn uns Eltern mit Kinderwagen zur Schule begleiten, dann bleibt der Wagen vor der Eingangst\u00fcr des Schulhauses stehen.\n 3. Wir gehen achtsam und ordentlich mit dem Eigentum der Schule und des Hortes um.\n 4. Wir behandeln alle Materialien sorgf\u00e4ltig und legen sie an den Ort zur\u00fcck, wo sie hingeh\u00f6ren.\n 5. Wir k\u00f6nnen nach dem Mittagessen in Absprache mit den Erzieherinnen selbstst\u00e4ndig die Spielger\u00e4te benutzen und bringen sie wieder zur\u00fcck.\n 6. Wir gehen achtsam und ordentlich mit den Spielger\u00e4ten um.\n 7. Wir klettern nicht auf B\u00e4ume und benutzen die B\u00e4nke nur als Sitzgelegenheiten.\n 8. Wir beachten die Regeln beim Umgang mit den Spielger\u00e4ten, um Unf\u00e4lle zu vermeiden.\n 9. Die Steine rund ums Schulhaus bleiben liegen.\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Text ausrichten\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/15676dd4-d57f-40f4-82d6-ed050cc595c3", "raw_diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1790166251.0061853, "prev_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n Hausordnung\n\n Grundschule Gro\u00dflehna\n\n Startseite \u00bb \u00dcber uns \u00bb Hausordnung\n\n Ein respektvoller Umgang und die Einhaltung der Regeln sind uns wichtig\n\n Unsere Hausordnung\n\n Die Grundschule ist eine Schule in Tr\u00e4gerschaft der Stadt Markranst\u00e4dt.\n\n An 4 Tagen in der Woche (Mo-Do) werden Ganztagsangebote in gebundener Form (verbindlich f\u00fcr alle Sch\u00fcler) unterbreitet.\n\n Tagesstruktur:\n\n 0. Stunde 6.00 \u2013 7.30 Uhr Fr\u00fchhort\n\n 1. Stunde 7.45 \u2013 8.30 Uhr Fr\u00fchst\u00fcckspause\n\n 2. Stunde 8.45 \u2013 9.30 Uhr Hofpause\n\n 3. Stunde 9.50 \u2013 10.35 Uhr\n\n 4. Stunde 10.40 \u2013 11.25 Uhr Mittagspause\n\n 5. Stunde 12.25 \u2013 13.10 Uhr\n\n 6. Stunde 13.15 \u2013 14.00 Uhr\n\n Die Ganztagsangebote finden in der Regel bis 14.00 Uhr statt. Nach Unterrichtsschluss \u00fcbernehmen die Horterzieher die Kinder und betreuen sie je nach Vertrag bis l\u00e4ngstens 17.00 Uhr.\n\n Entschuldigungen: Die Eltern entschuldigen ihr Kind bis sp\u00e4testens 7.30 Uhr telefonisch. Die Entschuldigungen werden von der Schule an den Hort weitergeleitet. Eine schriftliche Entschuldigung ist immer unter Angabe des Grundes abzugeben.\n\n Sportunterricht: Vor dem Unterricht werden Gegenst\u00e4nde, die eine unfall-und/oder verletzungsfreie Durchf\u00fchrung des Unterrichts gef\u00e4hrden k\u00f6nnten, ausnahmslos abgelegt. Dazu geh\u00f6ren: Uhren, Schmuck (Ringe, Ketten, Armreifen, Armb\u00e4nder, Ohrringe, Ohrstecker, Piercings) sowie Schl\u00fcssel und G\u00fcrtel.\n\n Haare, die durch ihre L\u00e4nge eine Gefahr darstellen oder das Sichtfeld des Sch\u00fclers beeintr\u00e4chtigen, m\u00fcssen entsprechend fixiert werden. Langes Haar (ab Schulterl\u00e4nge) muss grunds\u00e4tzlich zusammengebunden sein.\n\n In der Turnhalle sind nur Turnschuhe aus Stoff oder Leder mit hellen Sohlen erlaubt, keine Stra\u00dfenschuhe! St\u00e4ndige Brillentr\u00e4ger tragen eine Sportbrille.\n\n Das Betreten der Turnhalle durch die Sch\u00fcler und die Benutzung der Sportger\u00e4te erfolgt nur auf Anweisung des Sportlehrers.\n\n Sportbefreiungen \u00fcber eine Woche erfordern eine \u00e4rztliche Bescheinigung. Eine Sportbefreiung l\u00e4nger als 4 Wochen erfordert ein amts\u00e4rztliches Gutachten.\n\n Freistellungen: In dringenden F\u00e4llen (nicht zur Urlaubsverl\u00e4ngerung) ist eine Freistellung m\u00f6glich, welche schriftlich beim Schulleiter beantragt wird.\n\n Allgemeine Regeln\n\n 1. Wir wollen uns in der Schule wohlf\u00fchlen, deshalb achten wir auf r\u00fccksichtsvolles Verhalten, gehen respektvoll miteinander um und gr\u00fc\u00dfen einander.\n 2. Wir erscheinen p\u00fcnktlich, bis sp\u00e4testens 7.30 Uhr zum Unterricht.\n 3. Wir packen in der Pause die Schulsachen f\u00fcr den n\u00e4chsten Unterricht aus.\n 4. Alle Dinge, die nicht zum Unterricht geh\u00f6ren, bleiben im Ranzen. Die Schule \u00fcbernimmt keine Haftung.\n 5. Wir nutzen die kleinen Pausen zur Erholung und zur Vorbereitung auf die n\u00e4chste Unterrichtsstunde. Daher bewegen wir uns in den Klassenr\u00e4umen und auf den Fluren leise und r\u00fccksichtsvoll und rennen nicht im Schulhaus.\n 6. Wir gehen m\u00f6glichst in der Pause auf die Toilette.\n 7. Wir achten in der Schule und im Hort auf Sauberkeit, Ordnung und Hygiene.\n 8. Wir sammeln den M\u00fcll in getrennten Beh\u00e4ltern \u2013 dadurch helfen wir der Umwelt.\n 9. Wir verlassen das Schulgeb\u00e4ude nur mit Erlaubnis einer Lehrerin oder Erzieherin.\n 10. Die Terrassent\u00fcren werden nur mit Erlaubnis einer Lehrerin oder Erzieherin ge\u00f6ffnet.\n 11. Wir verlassen bei Ert\u00f6nen des Alarmsignals sofort mit unserer Lehrerin/ Erzieherin ruhig und diszipliniert das Geb\u00e4ude entsprechend des Fluchtplanes.\n 12. Mobile Endger\u00e4te sind in der Schule nicht erlaubt.\n 13. Eltern ist es untersagt, fremde Kinder im Schulgel\u00e4nde oder -geb\u00e4ude zu ma\u00dfregeln.\n\n Verhalten im Au\u00dfenbereich\n\n 1. Wir schieben Fahrr\u00e4der oder Roller auf dem gesamten Gel\u00e4nde und stellen sie in den vorgesehenen St\u00e4ndern ab.\n 2. Wenn uns Eltern mit Kinderwagen zur Schule begleiten, dann bleibt der Wagen vor der Eingangst\u00fcr des Schulhauses stehen.\n 3. Wir gehen achtsam und ordentlich mit dem Eigentum der Schule und des Hortes um.\n 4. Wir behandeln alle Materialien sorgf\u00e4ltig und legen sie an den Ort zur\u00fcck, wo sie hingeh\u00f6ren.\n 5. Wir k\u00f6nnen nach dem Mittagessen in Absprache mit den Erzieherinnen selbstst\u00e4ndig die Spielger\u00e4te benutzen und bringen sie wieder zur\u00fcck.\n 6. Wir gehen achtsam und ordentlich mit den Spielger\u00e4ten um.\n 7. Wir klettern nicht auf B\u00e4ume und benutzen die B\u00e4nke nur als Sitzgelegenheiten.\n 8. Wir beachten die Regeln beim Umgang mit den Spielger\u00e4ten, um Unf\u00e4lle zu vermeiden.\n 9. Die Steine rund ums Schulhaus bleiben liegen.\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Align Text\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "preview_url": "https://changes.sotzny.net/preview/15676dd4-d57f-40f4-82d6-ed050cc595c3", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "15676dd4-d57f-40f4-82d6-ed050cc595c3", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "Schule", "watch_title": "Hausordnung - Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna", "watch_url": "https://grundschule-nils-holgersson.de/ueber-uns/hausordnung/", "watch_open_url": "https://grundschule-nils-holgersson.de/ueber-uns/hausordnung/", "watch_uuid": "15676dd4-d57f-40f4-82d6-ed050cc595c3", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/15676dd4-d57f-40f4-82d6-ed050cc595c3"}}]
- Wed 23 Sep 2026 12:23:36 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://grundschule-nils-holgersson.de/eltern/elternvertretung/", "body": "https://grundschule-nils-holgersson.de/eltern/elternvertretung/ had a change.\n---\n<s> Align Text</s>\n<b> Text ausrichten</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-23 12:23:36 UTC", "current_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n Elternvertretung\n\n Grundschule Gro\u00dflehna\n\n Startseite \u00bb Eltern \u00bb Elternvertretung\n\n Wir stellen uns vor\n\n Vorsitz: Frau Beyenbach\n\n Vertretung: Herr Spieler\n\n Was macht der Elternrat und warum ist er so wichtig?\n\n Elternvertreter/innen sind Vermittler zwischen der Elternschaft und der gesamten Schul \u2013 und Hortgemeinschaft. Ziel ist es, Anregungen und Wu\u0308nsche von Seiten der Eltern gebu\u0308ndelt an Schule und Hort zu transportieren und als stetiges Bindeglied f\u00fcr beide Seiten gleichberechtigt zu fungieren.\n\n Fu\u0308r eine gelungene Zusammenarbeit zwischen Schule, Hort und der Elternschaft ist es wichtig, dass Elternvertreter/innen eine vertrauensvolle und kooperative Basis fu\u0308r die Zusammenarbeit anstreben. So ko\u0308nnen sowohl die Belange der Eltern, als auch die Anliegen der Schulgemeinschaft Geho\u0308r finden und davon profitieren letztendlich alle Kinder beider Institutionen. Der Elternrat wird versta\u0308rkt u\u0308ber Themen der Schule informiert und ist somit zum einen direkter Kooperationspartner als auch Sprachrohr der Elternschaft.\n\n Wenn Eltern eingeladen werden, ihr Wissen, ihre Kompetenzen oder ihre Interessen in Schule und Hort einzubringen, erweitert sich das Bildungsangebot. Der Elternrat ist dabei ein wertvolles Organ, wo Schule, Hort und Elternschaft ins Gespra\u0308ch kommen und andere Perspektiven einbringen, mit dem Ziel die Qualit\u00e4t in der Schule zu sch\u00fctzen, sicherzustellen und gemeinsam weiterzuentwickeln.\n\n Je enger und vertrauensvoller Eltern und Schule zusammenarbeiten, desto stimmiger verla\u0308uft der Alltag der einzelnen Kinder. Das Ziel ist eine Bildungs \u2013 und Erziehungspartnerschaft, bei der sich Familie und Schule fu\u0308reinander o\u0308ffnen, ihre Vorstellungen austauschen und zum Wohl der ihnen anvertrauten Kinder kooperieren. Sie erkennen die Bedeutung der jeweils anderen Lebenswelt fu\u0308r das Kind an und teilen ihre gemeinsame Verantwortung fu\u0308r die Kinder. Die Mitwirkung der Eltern ist unerla\u0308sslich, damit Kinder die Schule als Ort des Lernens, der Erfahrung und des Wohlbefindens erleben. Zus\u00e4tzlich soll der Hort als \u201efamilienerga\u0308nzende Einrichtung\u201c wahrgenommen werden und die bestmo\u0308glichen Entwicklungsbedingungen gemeinsam mit dem Elternrat anstreben.\n\n Aufgaben des Elternrates:\n\n * Berichtspflicht gegen\u00fcber den Klasseneltern-Jahrgangsstufensprechern\n * Ansprechpartner f\u00fcr Eltern\n * Unterst\u00fctzung der Klasse bzw. Schule bei der Organisation von schulischen Veranstaltungen\n * Vertretung der Interessen der Eltern gegen\u00fcber der Schule, dem Schultr\u00e4ger und den Schulaufsichtsbeh\u00f6rden\n * M\u00f6glichkeit zur Stellungnahme vor Beschl\u00fcssen der Lehrerkonferenzen, die von grunds\u00e4tzlicher Bedeutung f\u00fcr die Erziehungs- und Unterrichtsarbeit der Schule sind\n * Wahl eines Vorsitzenden sowie dessen Stellvertreter\n\n Sprechen Sie uns an: elternrat-gs-grosslehna@web.de\n\n Bei Anfragen und Problemen k\u00f6nnen sich alle Eltern gern an uns wenden.\n\n Herzlichst \u2013 Ihr Elternrat\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Text ausrichten\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/941454b5-a951-4d86-9be4-69ab86178b8d", "raw_diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1790166216.8939037, "prev_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n Elternvertretung\n\n Grundschule Gro\u00dflehna\n\n Startseite \u00bb Eltern \u00bb Elternvertretung\n\n Wir stellen uns vor\n\n Vorsitz: Frau Beyenbach\n\n Vertretung: Herr Spieler\n\n Was macht der Elternrat und warum ist er so wichtig?\n\n Elternvertreter/innen sind Vermittler zwischen der Elternschaft und der gesamten Schul \u2013 und Hortgemeinschaft. Ziel ist es, Anregungen und Wu\u0308nsche von Seiten der Eltern gebu\u0308ndelt an Schule und Hort zu transportieren und als stetiges Bindeglied f\u00fcr beide Seiten gleichberechtigt zu fungieren.\n\n Fu\u0308r eine gelungene Zusammenarbeit zwischen Schule, Hort und der Elternschaft ist es wichtig, dass Elternvertreter/innen eine vertrauensvolle und kooperative Basis fu\u0308r die Zusammenarbeit anstreben. So ko\u0308nnen sowohl die Belange der Eltern, als auch die Anliegen der Schulgemeinschaft Geho\u0308r finden und davon profitieren letztendlich alle Kinder beider Institutionen. Der Elternrat wird versta\u0308rkt u\u0308ber Themen der Schule informiert und ist somit zum einen direkter Kooperationspartner als auch Sprachrohr der Elternschaft.\n\n Wenn Eltern eingeladen werden, ihr Wissen, ihre Kompetenzen oder ihre Interessen in Schule und Hort einzubringen, erweitert sich das Bildungsangebot. Der Elternrat ist dabei ein wertvolles Organ, wo Schule, Hort und Elternschaft ins Gespra\u0308ch kommen und andere Perspektiven einbringen, mit dem Ziel die Qualit\u00e4t in der Schule zu sch\u00fctzen, sicherzustellen und gemeinsam weiterzuentwickeln.\n\n Je enger und vertrauensvoller Eltern und Schule zusammenarbeiten, desto stimmiger verla\u0308uft der Alltag der einzelnen Kinder. Das Ziel ist eine Bildungs \u2013 und Erziehungspartnerschaft, bei der sich Familie und Schule fu\u0308reinander o\u0308ffnen, ihre Vorstellungen austauschen und zum Wohl der ihnen anvertrauten Kinder kooperieren. Sie erkennen die Bedeutung der jeweils anderen Lebenswelt fu\u0308r das Kind an und teilen ihre gemeinsame Verantwortung fu\u0308r die Kinder. Die Mitwirkung der Eltern ist unerla\u0308sslich, damit Kinder die Schule als Ort des Lernens, der Erfahrung und des Wohlbefindens erleben. Zus\u00e4tzlich soll der Hort als \u201efamilienerga\u0308nzende Einrichtung\u201c wahrgenommen werden und die bestmo\u0308glichen Entwicklungsbedingungen gemeinsam mit dem Elternrat anstreben.\n\n Aufgaben des Elternrates:\n\n * Berichtspflicht gegen\u00fcber den Klasseneltern-Jahrgangsstufensprechern\n * Ansprechpartner f\u00fcr Eltern\n * Unterst\u00fctzung der Klasse bzw. Schule bei der Organisation von schulischen Veranstaltungen\n * Vertretung der Interessen der Eltern gegen\u00fcber der Schule, dem Schultr\u00e4ger und den Schulaufsichtsbeh\u00f6rden\n * M\u00f6glichkeit zur Stellungnahme vor Beschl\u00fcssen der Lehrerkonferenzen, die von grunds\u00e4tzlicher Bedeutung f\u00fcr die Erziehungs- und Unterrichtsarbeit der Schule sind\n * Wahl eines Vorsitzenden sowie dessen Stellvertreter\n\n Sprechen Sie uns an: elternrat-gs-grosslehna@web.de\n\n Bei Anfragen und Problemen k\u00f6nnen sich alle Eltern gern an uns wenden.\n\n Herzlichst \u2013 Ihr Elternrat\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Align Text\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "preview_url": "https://changes.sotzny.net/preview/941454b5-a951-4d86-9be4-69ab86178b8d", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "941454b5-a951-4d86-9be4-69ab86178b8d", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "Schule", "watch_title": "Elternvertretung - Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna", "watch_url": "https://grundschule-nils-holgersson.de/eltern/elternvertretung/", "watch_open_url": "https://grundschule-nils-holgersson.de/eltern/elternvertretung/", "watch_uuid": "941454b5-a951-4d86-9be4-69ab86178b8d", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/941454b5-a951-4d86-9be4-69ab86178b8d"}}]
- Wed 23 Sep 2026 12:23:15 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://grundschule-nils-holgersson.de/gta/angebote/", "body": "https://grundschule-nils-holgersson.de/gta/angebote/ had a change.\n---\n<s> Align Text</s>\n<b> Text ausrichten</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-23 12:23:14 UTC", "current_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n Angebote\n\n Grundschule Gro\u00dflehna\n\n Startseite \u00bb GTA \u00bb Angebote\n\n Unsere Angebote im Schuljahr 2025/26:\n\n * Sport & Spiel f\u00fcr Jungen und M\u00e4dchen\n * Floorball\n * Theaterspiele\n * Kleine G\u00e4rtner\n * Backen\n * Lego Robotik\n * Gitarre\n * Naturbasteln\n * Schach\n * Kinderchor\n * Kreativ\n\n GTA-Fotos\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Text ausrichten\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/f0e38067-1ff9-4ac5-abca-186834c021ba", "raw_diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1790166194.894169, "prev_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n Angebote\n\n Grundschule Gro\u00dflehna\n\n Startseite \u00bb GTA \u00bb Angebote\n\n Unsere Angebote im Schuljahr 2025/26:\n\n * Sport & Spiel f\u00fcr Jungen und M\u00e4dchen\n * Floorball\n * Theaterspiele\n * Kleine G\u00e4rtner\n * Backen\n * Lego Robotik\n * Gitarre\n * Naturbasteln\n * Schach\n * Kinderchor\n * Kreativ\n\n GTA-Fotos\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Align Text\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "preview_url": "https://changes.sotzny.net/preview/f0e38067-1ff9-4ac5-abca-186834c021ba", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "f0e38067-1ff9-4ac5-abca-186834c021ba", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "Schule", "watch_title": "Angebote - Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna", "watch_url": "https://grundschule-nils-holgersson.de/gta/angebote/", "watch_open_url": "https://grundschule-nils-holgersson.de/gta/angebote/", "watch_uuid": "f0e38067-1ff9-4ac5-abca-186834c021ba", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/f0e38067-1ff9-4ac5-abca-186834c021ba"}}]
- Wed 23 Sep 2026 12:22:29 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://grundschule-nils-holgersson.de/ueber-uns/schulteam/", "body": "https://grundschule-nils-holgersson.de/ueber-uns/schulteam/ had a change.\n---\n<s> Align Text</s>\n<b> Text ausrichten</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-23 12:22:28 UTC", "current_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n Schulteam\n\n Grundschule Gro\u00dflehna\n\n Startseite \u00bb \u00dcber uns \u00bb Schulteam\n\n Das Schulteam stellt sich vor\n\n \u2013\n\n\n Schulleiterin: Sandra Schuh\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Sport\n\n \u2013\n \u2013\n Stellvertretende Schulleiterin: Jasmin Tzschoppe\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Sport\n LernSax: jasmin.tzschoppe@gsniho.lernsax.de\n\n \u2014\n\n\n Schulsachbearbeiterin: Uta Klesse\n Kontakt: info@grundschule-nils-holgersson.de\n\n -\u2014\n \u2013\n\n Fachlehrerin: Heike Zschoche\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Kunst, Werken\n LernSax: heike.zschoche@gsniho.lernsax.de\n\n \u2014\n\n\n Fachlehrerin: Victoria Licht \u2013 Becker\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Ethik, Sport\n LernSax: victoria.licht@gsniho.lernsax.de\n\n \u2013\n\n\n Klassenlehrerin: Sylva Naundorf\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Kunst\n LernSax: sylva.naundorf@gsniho.lernsax.de\n\n \u2013\n\n\n Klassenlehrerin: Sophie Rochol\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Sport\n LernSax: sophie.rochol@gsniho.lernsax.de\n\n \u2013\n\n \u2013\n Klassenlehrer: Martin Daniel\n F\u00e4cher: Mathe, Deutsch, Sachunterricht, Werken\n LernSax: martin.daniel@gsniho.lernsax.de\n\n \u2013\n\n\n Klassenlehrerin: Annemarie Kummich\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Musik\n LernSax: annemarie.kummich@gsniho.lernsax.de\n\n \u2013\n\n\n Klassenlehrerin: Michelle Jung\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Ethik\n LernSax: michelle.jung@gsniho.lernsax.de\n\n \u2014\n\n\n Klassenlehrerin: Anja Lehmann\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Englisch\n LernSax: anja.lehmann@gsniho.lernsax.de\n\n \u2013\n\n\n Klassenlehrerin: Kathleen Dose\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Musik, Sport\n LernSax: kathleen.dose@gsniho.lernsax.de\n\n -\u2014\n \u2014\n\n \u2013\n Klassenlehrerin: Alice Ullmann\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Englisch\n LernSax: alice.ullmann@gsniho.lernsax.de\n\n \u2013\n\n\n Hausmeister: Steffen Ullmann\n Diensthandy: 0172-7509569\n\n \u2013\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Text ausrichten\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/63dcf6f4-85f3-4f14-a3ed-a2ae84af6b53", "raw_diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1790166148.8320389, "prev_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n Schulteam\n\n Grundschule Gro\u00dflehna\n\n Startseite \u00bb \u00dcber uns \u00bb Schulteam\n\n Das Schulteam stellt sich vor\n\n \u2013\n\n\n Schulleiterin: Sandra Schuh\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Sport\n\n \u2013\n \u2013\n Stellvertretende Schulleiterin: Jasmin Tzschoppe\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Sport\n LernSax: jasmin.tzschoppe@gsniho.lernsax.de\n\n \u2014\n\n\n Schulsachbearbeiterin: Uta Klesse\n Kontakt: info@grundschule-nils-holgersson.de\n\n -\u2014\n \u2013\n\n Fachlehrerin: Heike Zschoche\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Kunst, Werken\n LernSax: heike.zschoche@gsniho.lernsax.de\n\n \u2014\n\n\n Fachlehrerin: Victoria Licht \u2013 Becker\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Ethik, Sport\n LernSax: victoria.licht@gsniho.lernsax.de\n\n \u2013\n\n\n Klassenlehrerin: Sylva Naundorf\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Kunst\n LernSax: sylva.naundorf@gsniho.lernsax.de\n\n \u2013\n\n\n Klassenlehrerin: Sophie Rochol\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Sport\n LernSax: sophie.rochol@gsniho.lernsax.de\n\n \u2013\n\n \u2013\n Klassenlehrer: Martin Daniel\n F\u00e4cher: Mathe, Deutsch, Sachunterricht, Werken\n LernSax: martin.daniel@gsniho.lernsax.de\n\n \u2013\n\n\n Klassenlehrerin: Annemarie Kummich\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Musik\n LernSax: annemarie.kummich@gsniho.lernsax.de\n\n \u2013\n\n\n Klassenlehrerin: Michelle Jung\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Ethik\n LernSax: michelle.jung@gsniho.lernsax.de\n\n \u2014\n\n\n Klassenlehrerin: Anja Lehmann\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Englisch\n LernSax: anja.lehmann@gsniho.lernsax.de\n\n \u2013\n\n\n Klassenlehrerin: Kathleen Dose\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Musik, Sport\n LernSax: kathleen.dose@gsniho.lernsax.de\n\n -\u2014\n \u2014\n\n \u2013\n Klassenlehrerin: Alice Ullmann\n F\u00e4cher: Deutsch, Mathematik, Sachunterricht, Englisch\n LernSax: alice.ullmann@gsniho.lernsax.de\n\n \u2013\n\n\n Hausmeister: Steffen Ullmann\n Diensthandy: 0172-7509569\n\n \u2013\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Align Text\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "preview_url": "https://changes.sotzny.net/preview/63dcf6f4-85f3-4f14-a3ed-a2ae84af6b53", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "63dcf6f4-85f3-4f14-a3ed-a2ae84af6b53", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "Schule", "watch_title": "Schulteam - Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna", "watch_url": "https://grundschule-nils-holgersson.de/ueber-uns/schulteam/", "watch_open_url": "https://grundschule-nils-holgersson.de/ueber-uns/schulteam/", "watch_uuid": "63dcf6f4-85f3-4f14-a3ed-a2ae84af6b53", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/63dcf6f4-85f3-4f14-a3ed-a2ae84af6b53"}}]
- Wed 23 Sep 2026 12:21:13 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://grundschule-nils-holgersson.de/veranstaltungen/", "body": "https://grundschule-nils-holgersson.de/veranstaltungen/ had a change.\n---\n<s> Align Text</s>\n<b> Text ausrichten</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-23 12:21:12 UTC", "current_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n 0 Veranstaltungen gefunden.\n Es sind keine anstehenden Veranstaltungen vorhanden.\n Es sind keine anstehenden Veranstaltungen vorhanden.\n\n Veranstaltungen Suche und Ansichten, Navigation\n\n Suche\n Bitte Schl\u00fcsselwort eingeben. Suche nach Veranstaltungen Schl\u00fcsselwort.\n Veranstaltungen suchen\n\n Veranstaltung Ansichten-Navigation\n\n Liste\n * Liste\n * Monat\n * Tag\n * \n * \n Heute\n Anstehende Anstehende Datum w\u00e4hlen.\n\n Vergangene Veranstaltungen\n\n Sep. 17 2026\n 17. September - 17:30 - 19:00\n\n Schulkonferenz\n\n Sep. 3 2026\n 3. September - 4. September\n\n Radfahrausbildung Klasse 4a\n\n Sep. 1 2026\n 1. September\n\n ArkaZien\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Text ausrichten\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/93c69bc6-2fff-4bcd-b5bc-8054af245bd7", "raw_diff": "@changed_PLACEMARKER_OPEN Align Text@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN Text ausrichten@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1790166072.7196562, "prev_snapshot": "Zum Inhalt springen\n Toggle Navigation\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Unser Hort\n + Hortkonzeption\n + Betreuungszeiten\n + Aktivit\u00e4ten\n Toggle Navigation\n * Kontakt\n Suche nach:\n Men\u00fc\n * Startseite\n * \u00dcber uns\n + Schulgeb\u00e4ude\n + F\u00f6rderprojekte\n + Schulteam\n + Leitbild\n + Hausordnung\n * News & Events\n + Beitr\u00e4ge\n + Kalender/ Termine\n * GTA\n + Konzeption\n + Angebote\n * Eltern\n + Elternvertretung\n + F\u00f6rderverein\n * Hort\n + Hort\n + Der Hort stellt sich vor\n + Betreuungszeiten\n + Aktivit\u00e4ten\n * Kontakt\n * Datenschutz\n * Impressum\n Suche nach:\n 0 Veranstaltungen gefunden.\n Es sind keine anstehenden Veranstaltungen vorhanden.\n Es sind keine anstehenden Veranstaltungen vorhanden.\n\n Veranstaltungen Suche und Ansichten, Navigation\n\n Suche\n Bitte Schl\u00fcsselwort eingeben. Suche nach Veranstaltungen Schl\u00fcsselwort.\n Veranstaltungen suchen\n\n Veranstaltung Ansichten-Navigation\n\n Liste\n * Liste\n * Monat\n * Tag\n * \n * \n Heute\n Anstehende Anstehende Datum w\u00e4hlen.\n\n Vergangene Veranstaltungen\n\n Sep. 17 2026\n 17. September - 17:30 - 19:00\n\n Schulkonferenz\n\n Sep. 3 2026\n 3. September - 4. September\n\n Radfahrausbildung Klasse 4a\n\n Sep. 1 2026\n 1. September\n\n ArkaZien\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n Kontakt\n\n Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna\n Schwedenstra\u00dfe 1\n 04420 Markranst\u00e4dt\n\n Telefon: 034205 42760\n Telefax: 034205 427676\n\n E-Mail schreiben\n\n Anfahrt\n\n Google Maps\n\n Informationen\n\n Impressum\n Datenschutzerkl\u00e4rung\n Transparenzhinweis\n Kontakt\n\n Schulen im \u00dcberblick\n\n * Grundschule Kulkwitz\n\n * Gymnasium Markranst\u00e4dt\n\n * Grundschule Markranst\u00e4dt\n\n * Oberschule Markranst\u00e4dt\n\n \u00a9 Copyright 2026\n\nPage load link\n\n Deutsch\n\n Barrierefreiheits-Anpassungen\n\n Unterst\u00fctzt von OneTap\n\n Symbolleiste ausblenden\n W\u00e4hlen Sie Ihr Barrierefreiheitsprofil\n Sehbehinderten-Modus\n Verbessert die visuellen Elemente der Website\n Sehbehinderten-Modus\n Anfallssicheres Profil\n Entfernt Blitze und reduziert Farben\n Anfallssicheres Profil\n ADHD-freundlicher Modus\n Fokussiertes Browsing, ablenkungsfrei\n ADHD-freundlicher Modus\n Blinden-Modus\n Reduziert Ablenkungen, verbessert den Fokus\n Blinden-Modus\n Epilepsie-sicherer Modus\n D\u00e4mpft Farben und stoppt Blinken\n Epilepsie-sicherer Modus\n Inhaltsmodule\n Schriftgr\u00f6\u00dfe\n +\n\n Standard\n\n -\n\n Links hervorheben\n Zeilenh\u00f6he\n +\n\n Standard\n\n -\n\n Lesbare Schriftart\n Cursor\n Textvergr\u00f6\u00dferung\n Legastheniker-Schriftart\n Align Text\n Buchstabenabstand\n Schriftst\u00e4rke\n Farbmodule\n Dunkler Kontrast\n Heller Kontrast\n Hoher Kontrast\n Monochrom\n S\u00e4ttigung\n Orientierungsmodule\n Lesezeile\n Lesemaske\n Browser muss aktualisiert werden Ihr Browser unterst\u00fctzt keine Sprachausgabe. Bitte aktualisieren Sie Ihren Browser oder verwenden Sie einen mit aktivierter Sprachsynthese (z.B. Chrome, Edge, Safari). Wie aktualisieren?\n Seite vorlesen\n Tastaturnavigation\n Bilder ausblenden\n T\u00f6ne stummschalten\n Titel hervorheben\n Inhalt hervorheben\n Animationen stoppen\n Zum Inhalt springen Ausw\u00e4hlen...HauptinhaltNavigationFu\u00dfzeile\n Einstellungen zur\u00fccksetzen\n * \nNach oben", "preview_url": "https://changes.sotzny.net/preview/93c69bc6-2fff-4bcd-b5bc-8054af245bd7", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "93c69bc6-2fff-4bcd-b5bc-8054af245bd7", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "Schule", "watch_title": "Anstehende Veranstaltungen \u2013 Grundschule \u201eNils Holgersson\u201c Gro\u00dflehna", "watch_url": "https://grundschule-nils-holgersson.de/veranstaltungen/", "watch_open_url": "https://grundschule-nils-holgersson.de/veranstaltungen/", "watch_uuid": "93c69bc6-2fff-4bcd-b5bc-8054af245bd7", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/93c69bc6-2fff-4bcd-b5bc-8054af245bd7"}}]
- Wed 23 Sep 2026 10:12:18 AM - SENDING - [{"title": "ChangeDetection.io Notification - https://www.tnd.de/Site/1514", "body": "https://www.tnd.de/Site/1514 had a change.\n---\n<s> 2.37</s>\n<b> 2.39</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-23 10:11:56 UTC", "current_snapshot": " 2.39\n 1\n \u20ac\n Diesel", "diff": "@changed_PLACEMARKER_OPEN 2.37@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 2.39@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/f51fb228-02a0-4301-be31-75f38fa287e0", "raw_diff": "@changed_PLACEMARKER_OPEN 2.37@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 2.39@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1790158337.8918822, "prev_snapshot": " 2.37\n 1\n \u20ac\n Diesel", "preview_url": "https://changes.sotzny.net/preview/f51fb228-02a0-4301-be31-75f38fa287e0", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "f51fb228-02a0-4301-be31-75f38fa287e0", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "", "watch_title": "https://www.tnd.de/Site/1514", "watch_url": "https://www.tnd.de/Site/1514", "watch_open_url": "https://www.tnd.de/Site/1514", "watch_uuid": "f51fb228-02a0-4301-be31-75f38fa287e0", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/f51fb228-02a0-4301-be31-75f38fa287e0"}}]
- Sun 20 Sep 2026 10:03:20 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://grand-tamino-ranch.reitbuch.com/course.php", "body": "https://grand-tamino-ranch.reitbuch.com/course.php had a change.\n---\n<s> 20.09.2026</s>\n<s> Tagesritt</s>\n<s> Vorschau | Vollansicht</s>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-20 22:03:20 UTC", "current_snapshot": " Reitbuch\n\n GRAND TAMINO RANCH\n\n Benutzername\n Passwort\n Anmelden\n 24h Login\n Registrieren\n Passwort vergessen?\n * Wochenplan\n * Terminsuche\n * Kursangebot\n * Pension\n * Ticket-Shop\n * Sonstiges /\n Hilfe Optionen\n Deutsch English Fran\u00e7ais Magyar\n Registrieren Passwort vergessen?\n\n Hinweis\n\n \u00d7\n Bitte warten...\n Abbrechen\n\n Kursangebot\n\n Datum von\n Datum bis\n Suchen\n\n Suchergebnis\n\n 27.09.-18.12.2026\n Basiskurs DUO\n Vorschau | Vollansicht\n 27.09.2026\n Tagesritt\n Vorschau | Vollansicht\n 11.10.2026\n Tagesritt\n Vorschau | Vollansicht\n 12.10.-18.10.2026\n Reitcamp und optional Western Reitabzeichen 10/9/8/7\n Vorschau | Vollansicht\n 17.10.2026\n Bodenarbeit mit July Singer\n Vorschau | Vollansicht\n 19.10.-23.10.2026\n Reitcamp und optional Western Reitabzeichen 10/9/8/7\n Vorschau | Vollansicht\n 25.10.2026\n Tagesritt\n Vorschau | Vollansicht\n 14.11.2026\n Bodenarbeit mit July Singer\n Vorschau | Vollansicht\n 12.12.2026\n Bodenarbeit mit July Singer\n Vorschau | Vollansicht\n Hilfe | Impressum | Datenschutz | Nutzungsbedingungen | Widerruf | Barrierefreiheit | Monitor | reitbuch.com (v22.09/01)", "diff": "@removed_PLACEMARKER_OPEN 20.09.2026@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Tagesritt@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Vorschau | Vollansicht@removed_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/834058e8-4c30-440c-96a7-aab4854a758b", "raw_diff": "@removed_PLACEMARKER_OPEN 20.09.2026@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Tagesritt@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Vorschau | Vollansicht@removed_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789941800.323711, "prev_snapshot": " Reitbuch\n\n GRAND TAMINO RANCH\n\n Benutzername\n Passwort\n Anmelden\n 24h Login\n Registrieren\n Passwort vergessen?\n * Wochenplan\n * Terminsuche\n * Kursangebot\n * Pension\n * Ticket-Shop\n * Sonstiges /\n Hilfe Optionen\n Deutsch English Fran\u00e7ais Magyar\n Registrieren Passwort vergessen?\n\n Hinweis\n\n \u00d7\n Bitte warten...\n Abbrechen\n\n Kursangebot\n\n Datum von\n Datum bis\n Suchen\n\n Suchergebnis\n\n 20.09.2026\n Tagesritt\n Vorschau | Vollansicht\n 27.09.-18.12.2026\n Basiskurs DUO\n Vorschau | Vollansicht\n 27.09.2026\n Tagesritt\n Vorschau | Vollansicht\n 11.10.2026\n Tagesritt\n Vorschau | Vollansicht\n 12.10.-18.10.2026\n Reitcamp und optional Western Reitabzeichen 10/9/8/7\n Vorschau | Vollansicht\n 17.10.2026\n Bodenarbeit mit July Singer\n Vorschau | Vollansicht\n 19.10.-23.10.2026\n Reitcamp und optional Western Reitabzeichen 10/9/8/7\n Vorschau | Vollansicht\n 25.10.2026\n Tagesritt\n Vorschau | Vollansicht\n 14.11.2026\n Bodenarbeit mit July Singer\n Vorschau | Vollansicht\n 12.12.2026\n Bodenarbeit mit July Singer\n Vorschau | Vollansicht\n Hilfe | Impressum | Datenschutz | Nutzungsbedingungen | Widerruf | Barrierefreiheit | Monitor | reitbuch.com (v22.09/01)", "preview_url": "https://changes.sotzny.net/preview/834058e8-4c30-440c-96a7-aab4854a758b", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "834058e8-4c30-440c-96a7-aab4854a758b", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "", "watch_title": "Kurse | GRAND TAMINO RANCH", "watch_url": "https://grand-tamino-ranch.reitbuch.com/course.php", "watch_open_url": "https://grand-tamino-ranch.reitbuch.com/course.php", "watch_uuid": "834058e8-4c30-440c-96a7-aab4854a758b", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/834058e8-4c30-440c-96a7-aab4854a758b"}}]
- Sun 20 Sep 2026 06:10:02 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://changedetection.io/CHANGELOG.txt", "body": "https://changedetection.io/CHANGELOG.txt had a change.\n---\n<s>HEAD / 2026-09-20 16:00:12 +0200:</s>\n<b>HEAD / 2026-09-20 19:45:11 +0200:</b>\n<b> - Our first basic PWA mobile integration! Look for the QR-Code in Settings (#4472)</b>\n<b> - UI - Prevent accidental change of LLM Key (#4473)</b>\n<b> - LLM - Fixes for temperature/reasoning GPT-5 etc</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-20 18:10:01 UTC", "current_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-20 19:45:11 +0200:\n - Our first basic PWA mobile integration! Look for the QR-Code in Settings (#4472)\n - UI - Prevent accidental change of LLM Key (#4473)\n - LLM - Fixes for temperature/reasoning GPT-5 etc\n - LLM - UI nonblocking (#4469)\n - LLM timeout improvements (frontend) (#4470)\n - LLM UI - When LLM is disabled, hide it from the groups settings also (#4471)\n - Make LLM summary from UI non blocking (#4467)\n - Groups - UI fix for #4451 and tweaks (#4466)\n - UI - LLM - Tidy up styling\n - UI: make editing a configured LLM model discoverable (#4400)\n - i18n: Add ja translations for new UI (#4464)\n - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)\n - UI - sidebar - background fixes\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-20 16:00:12 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-20 19:45:11 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - Our first basic PWA mobile integration! Look for the QR-Code in Settings (#4472)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI - Prevent accidental change of LLM Key (#4473)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - LLM - Fixes for temperature/reasoning GPT-5 etc@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/308c5c76-e290-4660-9296-62bcf1731735", "raw_diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-20 16:00:12 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-20 19:45:11 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - Our first basic PWA mobile integration! Look for the QR-Code in Settings (#4472)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI - Prevent accidental change of LLM Key (#4473)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - LLM - Fixes for temperature/reasoning GPT-5 etc@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789927801.8217647, "prev_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-20 16:00:12 +0200:\n - LLM - UI nonblocking (#4469)\n - LLM timeout improvements (frontend) (#4470)\n - LLM UI - When LLM is disabled, hide it from the groups settings also (#4471)\n - Make LLM summary from UI non blocking (#4467)\n - Groups - UI fix for #4451 and tweaks (#4466)\n - UI - LLM - Tidy up styling\n - UI: make editing a configured LLM model discoverable (#4400)\n - i18n: Add ja translations for new UI (#4464)\n - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)\n - UI - sidebar - background fixes\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "preview_url": "https://changes.sotzny.net/preview/308c5c76-e290-4660-9296-62bcf1731735", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "308c5c76-e290-4660-9296-62bcf1731735", "watch_mime_type": "text/plain", "watch_tag": "changedetection.io", "watch_title": "https://changedetection.io/CHANGELOG.txt", "watch_url": "https://changedetection.io/CHANGELOG.txt", "watch_open_url": "https://changedetection.io/CHANGELOG.txt", "watch_uuid": "308c5c76-e290-4660-9296-62bcf1731735", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/308c5c76-e290-4660-9296-62bcf1731735"}}]
- Sun 20 Sep 2026 03:09:55 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://changedetection.io/CHANGELOG.txt", "body": "https://changedetection.io/CHANGELOG.txt had a change.\n---\n<s>HEAD / 2026-09-20 13:01:14 +0200:</s>\n<b>HEAD / 2026-09-20 16:00:12 +0200:</b>\n<b> - LLM - UI nonblocking (#4469)</b>\n<b> - LLM timeout improvements (frontend) (#4470)</b>\n<b> - LLM UI - When LLM is disabled, hide it from the groups settings also (#4471)</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-20 15:09:55 UTC", "current_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-20 16:00:12 +0200:\n - LLM - UI nonblocking (#4469)\n - LLM timeout improvements (frontend) (#4470)\n - LLM UI - When LLM is disabled, hide it from the groups settings also (#4471)\n - Make LLM summary from UI non blocking (#4467)\n - Groups - UI fix for #4451 and tweaks (#4466)\n - UI - LLM - Tidy up styling\n - UI: make editing a configured LLM model discoverable (#4400)\n - i18n: Add ja translations for new UI (#4464)\n - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)\n - UI - sidebar - background fixes\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-20 13:01:14 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-20 16:00:12 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - LLM - UI nonblocking (#4469)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - LLM timeout improvements (frontend) (#4470)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - LLM UI - When LLM is disabled, hide it from the groups settings also (#4471)@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/308c5c76-e290-4660-9296-62bcf1731735", "raw_diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-20 13:01:14 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-20 16:00:12 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - LLM - UI nonblocking (#4469)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - LLM timeout improvements (frontend) (#4470)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - LLM UI - When LLM is disabled, hide it from the groups settings also (#4471)@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789916995.715409, "prev_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-20 13:01:14 +0200:\n - Make LLM summary from UI non blocking (#4467)\n - Groups - UI fix for #4451 and tweaks (#4466)\n - UI - LLM - Tidy up styling\n - UI: make editing a configured LLM model discoverable (#4400)\n - i18n: Add ja translations for new UI (#4464)\n - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)\n - UI - sidebar - background fixes\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "preview_url": "https://changes.sotzny.net/preview/308c5c76-e290-4660-9296-62bcf1731735", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "308c5c76-e290-4660-9296-62bcf1731735", "watch_mime_type": "text/plain", "watch_tag": "changedetection.io", "watch_title": "https://changedetection.io/CHANGELOG.txt", "watch_url": "https://changedetection.io/CHANGELOG.txt", "watch_open_url": "https://changedetection.io/CHANGELOG.txt", "watch_uuid": "308c5c76-e290-4660-9296-62bcf1731735", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/308c5c76-e290-4660-9296-62bcf1731735"}}]
- Sun 20 Sep 2026 12:09:35 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://changedetection.io/CHANGELOG.txt", "body": "https://changedetection.io/CHANGELOG.txt had a change.\n---\n<s>HEAD / 2026-09-20 09:11:16 +0200:</s>\n<b>HEAD / 2026-09-20 13:01:14 +0200:</b>\n<b> - Make LLM summary from UI non blocking (#4467)</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-20 12:09:33 UTC", "current_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-20 13:01:14 +0200:\n - Make LLM summary from UI non blocking (#4467)\n - Groups - UI fix for #4451 and tweaks (#4466)\n - UI - LLM - Tidy up styling\n - UI: make editing a configured LLM model discoverable (#4400)\n - i18n: Add ja translations for new UI (#4464)\n - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)\n - UI - sidebar - background fixes\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-20 09:11:16 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-20 13:01:14 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - Make LLM summary from UI non blocking (#4467)@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/308c5c76-e290-4660-9296-62bcf1731735", "raw_diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-20 09:11:16 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-20 13:01:14 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - Make LLM summary from UI non blocking (#4467)@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789906174.4002821, "prev_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-20 09:11:16 +0200:\n - Groups - UI fix for #4451 and tweaks (#4466)\n - UI - LLM - Tidy up styling\n - UI: make editing a configured LLM model discoverable (#4400)\n - i18n: Add ja translations for new UI (#4464)\n - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)\n - UI - sidebar - background fixes\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "preview_url": "https://changes.sotzny.net/preview/308c5c76-e290-4660-9296-62bcf1731735", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "308c5c76-e290-4660-9296-62bcf1731735", "watch_mime_type": "text/plain", "watch_tag": "changedetection.io", "watch_title": "https://changedetection.io/CHANGELOG.txt", "watch_url": "https://changedetection.io/CHANGELOG.txt", "watch_open_url": "https://changedetection.io/CHANGELOG.txt", "watch_uuid": "308c5c76-e290-4660-9296-62bcf1731735", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/308c5c76-e290-4660-9296-62bcf1731735"}}]
- Sun 20 Sep 2026 09:09:43 AM - SENDING - [{"title": "ChangeDetection.io Notification - https://changedetection.io/CHANGELOG.txt", "body": "https://changedetection.io/CHANGELOG.txt had a change.\n---\n<s>HEAD / 2026-09-19 10:46:15 +0200:</s>\n<b>HEAD / 2026-09-20 09:11:16 +0200:</b>\n<b> - Groups - UI fix for #4451 and tweaks (#4466)</b>\n<b> - UI - LLM - Tidy up styling</b>\n<b> - UI: make editing a configured LLM model discoverable (#4400)</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-20 09:09:41 UTC", "current_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-20 09:11:16 +0200:\n - Groups - UI fix for #4451 and tweaks (#4466)\n - UI - LLM - Tidy up styling\n - UI: make editing a configured LLM model discoverable (#4400)\n - i18n: Add ja translations for new UI (#4464)\n - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)\n - UI - sidebar - background fixes\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-19 10:46:15 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-20 09:11:16 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - Groups - UI fix for #4451 and tweaks (#4466)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI - LLM - Tidy up styling@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI: make editing a configured LLM model discoverable (#4400)@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/308c5c76-e290-4660-9296-62bcf1731735", "raw_diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-19 10:46:15 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-20 09:11:16 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - Groups - UI fix for #4451 and tweaks (#4466)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI - LLM - Tidy up styling@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI: make editing a configured LLM model discoverable (#4400)@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789895382.2747834, "prev_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-19 10:46:15 +0200:\n - i18n: Add ja translations for new UI (#4464)\n - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)\n - UI - sidebar - background fixes\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "preview_url": "https://changes.sotzny.net/preview/308c5c76-e290-4660-9296-62bcf1731735", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "308c5c76-e290-4660-9296-62bcf1731735", "watch_mime_type": "text/plain", "watch_tag": "changedetection.io", "watch_title": "https://changedetection.io/CHANGELOG.txt", "watch_url": "https://changedetection.io/CHANGELOG.txt", "watch_open_url": "https://changedetection.io/CHANGELOG.txt", "watch_uuid": "308c5c76-e290-4660-9296-62bcf1731735", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/308c5c76-e290-4660-9296-62bcf1731735"}}]
- Sat 19 Sep 2026 10:46:33 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://www.ncn-festival.de/programm/running-order/", "body": "https://www.ncn-festival.de/programm/running-order/ had a change.\n---\n<b></b>\n<b> Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.</b>\n<b></b>\n<b> Datenschutzeinstellungen</b>\n<b></b>\n<b> Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.</b>\n<b></b>\n<b> Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.</b>\n<b></b>\n<b> Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.</b>\n<b></b>\n<b> Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.</b>\n<b></b>\n<b> Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.</b>\n<b></b>\n<b> Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.</b>\n<b></b>\n<b> Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.</b>\n<b></b>\n<b> Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.</b>\n<b></b>\n<b> Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.</b>\n<b></b>\n<b> Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.</b>\n<b> * Essenziell</b>\n<b> * Statistiken</b>\n<b> * Externe Medien</b>\n<b> Speichern</b>\n<b> Alle akzeptieren</b>\n<b> Individuelle Datenschutzeinstellungen</b>\n<b> Cookie-DetailsDatenschutzerkl\u00e4rungImpressum</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-19 22:44:26 UTC", "current_snapshot": " * \n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n Seite w\u00e4hlen\n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n * \n\n Running Order\n\n Line-Up\n Running Order\n Warm Up Party\n Rahmenprogramm\n\n Running Order\n\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n\n Partner\n\n Impressum | AGB | Datenschutzerkl\u00e4rung\n\n Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.\n\n Datenschutzeinstellungen\n\n Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.\n\n Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.\n\n Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.\n\n Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.\n\n Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.\n\n Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.\n\n Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.\n\n Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.\n\n Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.\n\n Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.\n * Essenziell\n * Statistiken\n * Externe Medien\n Speichern\n Alle akzeptieren\n Individuelle Datenschutzeinstellungen\n Cookie-DetailsDatenschutzerkl\u00e4rungImpressum", "diff": "@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Datenschutzeinstellungen@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN * Essenziell@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN * Statistiken@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN * Externe Medien@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Speichern@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Alle akzeptieren@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Individuelle Datenschutzeinstellungen@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Cookie-DetailsDatenschutzerkl\u00e4rungImpressum@added_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/31236833-eee3-46d2-aced-ccae65da8032", "raw_diff": "@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Datenschutzeinstellungen@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN * Essenziell@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN * Statistiken@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN * Externe Medien@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Speichern@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Alle akzeptieren@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Individuelle Datenschutzeinstellungen@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Cookie-DetailsDatenschutzerkl\u00e4rungImpressum@added_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789857993.038809, "prev_snapshot": " * \n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n Seite w\u00e4hlen\n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n * \n\n Running Order\n\n Line-Up\n Running Order\n Warm Up Party\n Rahmenprogramm\n\n Running Order\n\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n\n Partner\n\n Impressum | AGB | Datenschutzerkl\u00e4rung\n", "preview_url": "https://changes.sotzny.net/preview/31236833-eee3-46d2-aced-ccae65da8032", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "31236833-eee3-46d2-aced-ccae65da8032", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "NCN", "watch_title": "Running Order - NCN Festival", "watch_url": "https://www.ncn-festival.de/programm/running-order/", "watch_open_url": "https://www.ncn-festival.de/programm/running-order/", "watch_uuid": "31236833-eee3-46d2-aced-ccae65da8032", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/31236833-eee3-46d2-aced-ccae65da8032"}}]
- Sat 19 Sep 2026 10:00:43 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://grand-tamino-ranch.reitbuch.com/course.php", "body": "https://grand-tamino-ranch.reitbuch.com/course.php had a change.\n---\n<s> 19.09.2026</s>\n<s> Kindergeburtstag \u02eeSchatzsuche im Wilden Westen\u02ee</s>\n<s> Vorschau | Vollansicht</s>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-19 22:00:43 UTC", "current_snapshot": " Reitbuch\n\n GRAND TAMINO RANCH\n\n Benutzername\n Passwort\n Anmelden\n 24h Login\n Registrieren\n Passwort vergessen?\n * Wochenplan\n * Terminsuche\n * Kursangebot\n * Pension\n * Ticket-Shop\n * Sonstiges /\n Hilfe Optionen\n Deutsch English Fran\u00e7ais Magyar\n Registrieren Passwort vergessen?\n\n Hinweis\n\n \u00d7\n Bitte warten...\n Abbrechen\n\n Kursangebot\n\n Datum von\n Datum bis\n Suchen\n\n Suchergebnis\n\n 20.09.2026\n Tagesritt\n Vorschau | Vollansicht\n 27.09.-18.12.2026\n Basiskurs DUO\n Vorschau | Vollansicht\n 27.09.2026\n Tagesritt\n Vorschau | Vollansicht\n 11.10.2026\n Tagesritt\n Vorschau | Vollansicht\n 12.10.-18.10.2026\n Reitcamp und optional Western Reitabzeichen 10/9/8/7\n Vorschau | Vollansicht\n 17.10.2026\n Bodenarbeit mit July Singer\n Vorschau | Vollansicht\n 19.10.-23.10.2026\n Reitcamp und optional Western Reitabzeichen 10/9/8/7\n Vorschau | Vollansicht\n 25.10.2026\n Tagesritt\n Vorschau | Vollansicht\n 14.11.2026\n Bodenarbeit mit July Singer\n Vorschau | Vollansicht\n 12.12.2026\n Bodenarbeit mit July Singer\n Vorschau | Vollansicht\n Hilfe | Impressum | Datenschutz | Nutzungsbedingungen | Widerruf | Barrierefreiheit | Monitor | reitbuch.com (v22.09/01)", "diff": "@removed_PLACEMARKER_OPEN 19.09.2026@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Kindergeburtstag \u02eeSchatzsuche im Wilden Westen\u02ee@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Vorschau | Vollansicht@removed_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/834058e8-4c30-440c-96a7-aab4854a758b", "raw_diff": "@removed_PLACEMARKER_OPEN 19.09.2026@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Kindergeburtstag \u02eeSchatzsuche im Wilden Westen\u02ee@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Vorschau | Vollansicht@removed_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789855243.4424553, "prev_snapshot": " Reitbuch\n\n GRAND TAMINO RANCH\n\n Benutzername\n Passwort\n Anmelden\n 24h Login\n Registrieren\n Passwort vergessen?\n * Wochenplan\n * Terminsuche\n * Kursangebot\n * Pension\n * Ticket-Shop\n * Sonstiges /\n Hilfe Optionen\n Deutsch English Fran\u00e7ais Magyar\n Registrieren Passwort vergessen?\n\n Hinweis\n\n \u00d7\n Bitte warten...\n Abbrechen\n\n Kursangebot\n\n Datum von\n Datum bis\n Suchen\n\n Suchergebnis\n\n 19.09.2026\n Kindergeburtstag \u02eeSchatzsuche im Wilden Westen\u02ee\n Vorschau | Vollansicht\n 20.09.2026\n Tagesritt\n Vorschau | Vollansicht\n 27.09.-18.12.2026\n Basiskurs DUO\n Vorschau | Vollansicht\n 27.09.2026\n Tagesritt\n Vorschau | Vollansicht\n 11.10.2026\n Tagesritt\n Vorschau | Vollansicht\n 12.10.-18.10.2026\n Reitcamp und optional Western Reitabzeichen 10/9/8/7\n Vorschau | Vollansicht\n 17.10.2026\n Bodenarbeit mit July Singer\n Vorschau | Vollansicht\n 19.10.-23.10.2026\n Reitcamp und optional Western Reitabzeichen 10/9/8/7\n Vorschau | Vollansicht\n 25.10.2026\n Tagesritt\n Vorschau | Vollansicht\n 14.11.2026\n Bodenarbeit mit July Singer\n Vorschau | Vollansicht\n 12.12.2026\n Bodenarbeit mit July Singer\n Vorschau | Vollansicht\n Hilfe | Impressum | Datenschutz | Nutzungsbedingungen | Widerruf | Barrierefreiheit | Monitor | reitbuch.com (v22.09/01)", "preview_url": "https://changes.sotzny.net/preview/834058e8-4c30-440c-96a7-aab4854a758b", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "834058e8-4c30-440c-96a7-aab4854a758b", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "", "watch_title": "Kurse | GRAND TAMINO RANCH", "watch_url": "https://grand-tamino-ranch.reitbuch.com/course.php", "watch_open_url": "https://grand-tamino-ranch.reitbuch.com/course.php", "watch_uuid": "834058e8-4c30-440c-96a7-aab4854a758b", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/834058e8-4c30-440c-96a7-aab4854a758b"}}]
- Sat 19 Sep 2026 06:46:32 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://www.ncn-festival.de/programm/running-order/", "body": "https://www.ncn-festival.de/programm/running-order/ had a change.\n---\n<s></s>\n<s> Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.</s>\n<s></s>\n<s> Datenschutzeinstellungen</s>\n<s></s>\n<s> Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.</s>\n<s></s>\n<s> Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.</s>\n<s></s>\n<s> Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.</s>\n<s></s>\n<s> Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.</s>\n<s></s>\n<s> Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.</s>\n<s></s>\n<s> Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.</s>\n<s></s>\n<s> Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.</s>\n<s></s>\n<s> Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.</s>\n<s></s>\n<s> Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.</s>\n<s></s>\n<s> Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.</s>\n<s> * Essenziell</s>\n<s> * Statistiken</s>\n<s> * Externe Medien</s>\n<s> Speichern</s>\n<s> Alle akzeptieren</s>\n<s> Individuelle Datenschutzeinstellungen</s>\n<s> Cookie-DetailsDatenschutzerkl\u00e4rungImpressum</s>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-19 18:44:25 UTC", "current_snapshot": " * \n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n Seite w\u00e4hlen\n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n * \n\n Running Order\n\n Line-Up\n Running Order\n Warm Up Party\n Rahmenprogramm\n\n Running Order\n\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n\n Partner\n\n Impressum | AGB | Datenschutzerkl\u00e4rung\n", "diff": "@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Datenschutzeinstellungen@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN * Essenziell@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN * Statistiken@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN * Externe Medien@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Speichern@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Alle akzeptieren@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Individuelle Datenschutzeinstellungen@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Cookie-DetailsDatenschutzerkl\u00e4rungImpressum@removed_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/31236833-eee3-46d2-aced-ccae65da8032", "raw_diff": "@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Datenschutzeinstellungen@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN * Essenziell@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN * Statistiken@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN * Externe Medien@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Speichern@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Alle akzeptieren@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Individuelle Datenschutzeinstellungen@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Cookie-DetailsDatenschutzerkl\u00e4rungImpressum@removed_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789843591.9714947, "prev_snapshot": " * \n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n Seite w\u00e4hlen\n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n * \n\n Running Order\n\n Line-Up\n Running Order\n Warm Up Party\n Rahmenprogramm\n\n Running Order\n\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n\n Partner\n\n Impressum | AGB | Datenschutzerkl\u00e4rung\n\n Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.\n\n Datenschutzeinstellungen\n\n Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.\n\n Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.\n\n Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.\n\n Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.\n\n Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.\n\n Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.\n\n Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.\n\n Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.\n\n Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.\n\n Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.\n * Essenziell\n * Statistiken\n * Externe Medien\n Speichern\n Alle akzeptieren\n Individuelle Datenschutzeinstellungen\n Cookie-DetailsDatenschutzerkl\u00e4rungImpressum", "preview_url": "https://changes.sotzny.net/preview/31236833-eee3-46d2-aced-ccae65da8032", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "31236833-eee3-46d2-aced-ccae65da8032", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "NCN", "watch_title": "Running Order - NCN Festival", "watch_url": "https://www.ncn-festival.de/programm/running-order/", "watch_open_url": "https://www.ncn-festival.de/programm/running-order/", "watch_uuid": "31236833-eee3-46d2-aced-ccae65da8032", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/31236833-eee3-46d2-aced-ccae65da8032"}}]
- Sat 19 Sep 2026 09:09:10 AM - SENDING - [{"title": "ChangeDetection.io Notification - https://changedetection.io/CHANGELOG.txt", "body": "https://changedetection.io/CHANGELOG.txt had a change.\n---\n<s>HEAD / 2026-09-18 15:22:24 +0200:</s>\n<b>HEAD / 2026-09-19 10:46:15 +0200:</b>\n<b> - i18n: Add ja translations for new UI (#4464)</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-19 09:09:08 UTC", "current_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-19 10:46:15 +0200:\n - i18n: Add ja translations for new UI (#4464)\n - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)\n - UI - sidebar - background fixes\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-18 15:22:24 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-19 10:46:15 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - i18n: Add ja translations for new UI (#4464)@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/308c5c76-e290-4660-9296-62bcf1731735", "raw_diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-18 15:22:24 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-19 10:46:15 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - i18n: Add ja translations for new UI (#4464)@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789808949.1005545, "prev_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-18 15:22:24 +0200:\n - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)\n - UI - sidebar - background fixes\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "preview_url": "https://changes.sotzny.net/preview/308c5c76-e290-4660-9296-62bcf1731735", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "308c5c76-e290-4660-9296-62bcf1731735", "watch_mime_type": "text/plain", "watch_tag": "changedetection.io", "watch_title": "https://changedetection.io/CHANGELOG.txt", "watch_url": "https://changedetection.io/CHANGELOG.txt", "watch_open_url": "https://changedetection.io/CHANGELOG.txt", "watch_uuid": "308c5c76-e290-4660-9296-62bcf1731735", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/308c5c76-e290-4660-9296-62bcf1731735"}}]
- Fri 18 Sep 2026 10:26:22 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://github.blog/changelog/2026/?label=copilot", "body": "https://github.blog/changelog/2026/?label=copilot had a change.\n---\n<b> Sep.18 Improvement</b>\n<b></b>\n<b> Copilot code review: An improved review experience</b>\n<b> copilot</b>\n<b></b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-18 22:26:22 UTC", "current_snapshot": " Back to blog\n\n\n\n All New Releases Improvements Retired\n Filters ( 0 selected )\n\n\n\n Copilot Clear all\n\n Filters ( 0 selected )\n\n Match: Any All\n Tags\n * Account management\n * Actions\n * Application Security\n * Client apps\n * Collaboration tools\n * Community engagement\n * Copilot\n * Ecosystem & accessibility\n * Enterprise management tools\n * Platform governance\n * Projects & Issues\n * Supply chain security\n * Universe \u201825\n Clear all Apply\n\n\n\n September Sep 2026\n\n Sep.18 Improvement\n\n Copilot code review: An improved review experience\n copilot\n\n Sep.18 Release\n\n GitHub Copilot weekly releases \u2014 September 14\n copilot\n\n Sep.18 Retired\n\n Upcoming deprecation of selected GitHub Copilot models in mid-October\n copilot\n\n Sep.17 Improvement\n\n Copilot impact dashboard now shows feature engagement\n account management copilot enterprise management tools ... +2\n\n Sep.17 Improvement\n\n Agentic CLI customizations now in the usage metrics API\n account management copilot enterprise management tools ... +2\n\n Sep.16 Release\n\n Copilot budget increase requests are generally available\n copilot\n\n Sep.15 Release\n\n GitHub Copilot suggests custom properties definitions\n copilot platform governance ... +1\n\n Sep.14 Release\n\n Configure cost and quality in Copilot auto model selection\n copilot\n\n Sep.11 Improvement\n\n Add VS Code Agents to Copilot usage metrics\n account management copilot enterprise management tools ... +2\n\n Sep.11 Improvement\n\n Auto-resolution and analysis updates in Copilot code review\n copilot\n\n Sep.10 Release\n\n GitHub Copilot weekly releases \u2014 September 7\n copilot\n\n Sep.10 Retired\n\n MAI-Code-1-Flash deprecated\n copilot\n\n Sep.09 Improvement\n\n Enterprise managed permissions for GitHub Copilot agent operations\n client apps copilot enterprise management tools ... +2\n\n Sep.08 Release\n\n Enterprise-managed sandbox in Copilot for JetBrains\n copilot enterprise management tools ... +1\n\n Sep.04 Release\n\n GitHub Copilot weekly releases \u2014 August 31\n copilot\n\n Sep.04 Release\n\n GPT-6 Astra is generally available in GitHub Copilot\n copilot\n\n Sep.03 Retired\n\n Upcoming deprecation of selected GitHub Copilot models\n copilot\n\n Sep.03 Release\n\n Gemini 3.8 Flash is now available in GitHub Copilot\n copilot\n\n Sep.03 Release\n\n Reopening Copilot Business and Enterprise signups\n account management copilot ... +1\n\n Sep.02 Improvement\n\n Enterprise-managed settings support any default model\n client apps copilot enterprise management tools ... +2\n\n Sep.02 Release\n\n Content exclusions generally available in Copilot app and CLI\n copilot\n\n Sep.01 Improvement\n\n Set an expiration date for individual user budgets\n copilot enterprise management tools ... +1\n\n Sep.01 Release\n\n Copilot code review can now approve pull requests\n copilot\n\n Sep.01 Release\n\n Claude Fable 5.1 is generally available in GitHub Copilot\n copilot\n\n August Aug 2026\n\n\n July Jul 2026\n\n\n June Jun 2026\n\n\n May May 2026\n\n\n April Apr 2026\n\n\n March Mar 2026\n\n\n February Feb 2026\n\n\n January Jan 2026\n\n\n Subscribe to our developer newsletter\n\n Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.\n\n Enter your email* Subscribe\n\n By submitting, I agree to let GitHub and its affiliates use my information for personalized communications, targeted advertising, and campaign effectiveness. See the GitHub Privacy Statement for more details.\n\n Back to top", "diff": "@added_PLACEMARKER_OPEN Sep.18 Improvement@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Copilot code review: An improved review experience@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN copilot@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/70912de0-031b-4491-8949-3cb5a7d9ec3a", "raw_diff": "@added_PLACEMARKER_OPEN Sep.18 Improvement@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Copilot code review: An improved review experience@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN copilot@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789770382.060774, "prev_snapshot": " Back to blog\n\n\n\n All New Releases Improvements Retired\n Filters ( 0 selected )\n\n\n\n Copilot Clear all\n\n Filters ( 0 selected )\n\n Match: Any All\n Tags\n * Account management\n * Actions\n * Application Security\n * Client apps\n * Collaboration tools\n * Community engagement\n * Copilot\n * Ecosystem & accessibility\n * Enterprise management tools\n * Platform governance\n * Projects & Issues\n * Supply chain security\n * Universe \u201825\n Clear all Apply\n\n\n\n September Sep 2026\n\n Sep.18 Release\n\n GitHub Copilot weekly releases \u2014 September 14\n copilot\n\n Sep.18 Retired\n\n Upcoming deprecation of selected GitHub Copilot models in mid-October\n copilot\n\n Sep.17 Improvement\n\n Copilot impact dashboard now shows feature engagement\n account management copilot enterprise management tools ... +2\n\n Sep.17 Improvement\n\n Agentic CLI customizations now in the usage metrics API\n account management copilot enterprise management tools ... +2\n\n Sep.16 Release\n\n Copilot budget increase requests are generally available\n copilot\n\n Sep.15 Release\n\n GitHub Copilot suggests custom properties definitions\n copilot platform governance ... +1\n\n Sep.14 Release\n\n Configure cost and quality in Copilot auto model selection\n copilot\n\n Sep.11 Improvement\n\n Add VS Code Agents to Copilot usage metrics\n account management copilot enterprise management tools ... +2\n\n Sep.11 Improvement\n\n Auto-resolution and analysis updates in Copilot code review\n copilot\n\n Sep.10 Release\n\n GitHub Copilot weekly releases \u2014 September 7\n copilot\n\n Sep.10 Retired\n\n MAI-Code-1-Flash deprecated\n copilot\n\n Sep.09 Improvement\n\n Enterprise managed permissions for GitHub Copilot agent operations\n client apps copilot enterprise management tools ... +2\n\n Sep.08 Release\n\n Enterprise-managed sandbox in Copilot for JetBrains\n copilot enterprise management tools ... +1\n\n Sep.04 Release\n\n GitHub Copilot weekly releases \u2014 August 31\n copilot\n\n Sep.04 Release\n\n GPT-6 Astra is generally available in GitHub Copilot\n copilot\n\n Sep.03 Retired\n\n Upcoming deprecation of selected GitHub Copilot models\n copilot\n\n Sep.03 Release\n\n Gemini 3.8 Flash is now available in GitHub Copilot\n copilot\n\n Sep.03 Release\n\n Reopening Copilot Business and Enterprise signups\n account management copilot ... +1\n\n Sep.02 Improvement\n\n Enterprise-managed settings support any default model\n client apps copilot enterprise management tools ... +2\n\n Sep.02 Release\n\n Content exclusions generally available in Copilot app and CLI\n copilot\n\n Sep.01 Improvement\n\n Set an expiration date for individual user budgets\n copilot enterprise management tools ... +1\n\n Sep.01 Release\n\n Copilot code review can now approve pull requests\n copilot\n\n Sep.01 Release\n\n Claude Fable 5.1 is generally available in GitHub Copilot\n copilot\n\n August Aug 2026\n\n\n July Jul 2026\n\n\n June Jun 2026\n\n\n May May 2026\n\n\n April Apr 2026\n\n\n March Mar 2026\n\n\n February Feb 2026\n\n\n January Jan 2026\n\n\n Subscribe to our developer newsletter\n\n Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.\n\n Enter your email* Subscribe\n\n By submitting, I agree to let GitHub and its affiliates use my information for personalized communications, targeted advertising, and campaign effectiveness. See the GitHub Privacy Statement for more details.\n\n Back to top", "preview_url": "https://changes.sotzny.net/preview/70912de0-031b-4491-8949-3cb5a7d9ec3a", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "70912de0-031b-4491-8949-3cb5a7d9ec3a", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "", "watch_title": "GitHub Changelog", "watch_url": "https://github.blog/changelog/2026/?label=copilot", "watch_open_url": "https://github.blog/changelog/2026/?label=copilot", "watch_uuid": "70912de0-031b-4491-8949-3cb5a7d9ec3a", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/70912de0-031b-4491-8949-3cb5a7d9ec3a"}}]
- Fri 18 Sep 2026 10:21:23 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://github.blog/changelog/2026/?label=copilot", "body": "https://github.blog/changelog/2026/?label=copilot had a change.\n---\n<s> Sep.18 Improvement</s>\n<s></s>\n<s> Copilot code review: An improved review experience</s>\n<s> copilot</s>\n<s></s>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-18 22:21:23 UTC", "current_snapshot": " Back to blog\n\n\n\n All New Releases Improvements Retired\n Filters ( 0 selected )\n\n\n\n Copilot Clear all\n\n Filters ( 0 selected )\n\n Match: Any All\n Tags\n * Account management\n * Actions\n * Application Security\n * Client apps\n * Collaboration tools\n * Community engagement\n * Copilot\n * Ecosystem & accessibility\n * Enterprise management tools\n * Platform governance\n * Projects & Issues\n * Supply chain security\n * Universe \u201825\n Clear all Apply\n\n\n\n September Sep 2026\n\n Sep.18 Release\n\n GitHub Copilot weekly releases \u2014 September 14\n copilot\n\n Sep.18 Retired\n\n Upcoming deprecation of selected GitHub Copilot models in mid-October\n copilot\n\n Sep.17 Improvement\n\n Copilot impact dashboard now shows feature engagement\n account management copilot enterprise management tools ... +2\n\n Sep.17 Improvement\n\n Agentic CLI customizations now in the usage metrics API\n account management copilot enterprise management tools ... +2\n\n Sep.16 Release\n\n Copilot budget increase requests are generally available\n copilot\n\n Sep.15 Release\n\n GitHub Copilot suggests custom properties definitions\n copilot platform governance ... +1\n\n Sep.14 Release\n\n Configure cost and quality in Copilot auto model selection\n copilot\n\n Sep.11 Improvement\n\n Add VS Code Agents to Copilot usage metrics\n account management copilot enterprise management tools ... +2\n\n Sep.11 Improvement\n\n Auto-resolution and analysis updates in Copilot code review\n copilot\n\n Sep.10 Release\n\n GitHub Copilot weekly releases \u2014 September 7\n copilot\n\n Sep.10 Retired\n\n MAI-Code-1-Flash deprecated\n copilot\n\n Sep.09 Improvement\n\n Enterprise managed permissions for GitHub Copilot agent operations\n client apps copilot enterprise management tools ... +2\n\n Sep.08 Release\n\n Enterprise-managed sandbox in Copilot for JetBrains\n copilot enterprise management tools ... +1\n\n Sep.04 Release\n\n GitHub Copilot weekly releases \u2014 August 31\n copilot\n\n Sep.04 Release\n\n GPT-6 Astra is generally available in GitHub Copilot\n copilot\n\n Sep.03 Retired\n\n Upcoming deprecation of selected GitHub Copilot models\n copilot\n\n Sep.03 Release\n\n Gemini 3.8 Flash is now available in GitHub Copilot\n copilot\n\n Sep.03 Release\n\n Reopening Copilot Business and Enterprise signups\n account management copilot ... +1\n\n Sep.02 Improvement\n\n Enterprise-managed settings support any default model\n client apps copilot enterprise management tools ... +2\n\n Sep.02 Release\n\n Content exclusions generally available in Copilot app and CLI\n copilot\n\n Sep.01 Improvement\n\n Set an expiration date for individual user budgets\n copilot enterprise management tools ... +1\n\n Sep.01 Release\n\n Copilot code review can now approve pull requests\n copilot\n\n Sep.01 Release\n\n Claude Fable 5.1 is generally available in GitHub Copilot\n copilot\n\n August Aug 2026\n\n\n July Jul 2026\n\n\n June Jun 2026\n\n\n May May 2026\n\n\n April Apr 2026\n\n\n March Mar 2026\n\n\n February Feb 2026\n\n\n January Jan 2026\n\n\n Subscribe to our developer newsletter\n\n Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.\n\n Enter your email* Subscribe\n\n By submitting, I agree to let GitHub and its affiliates use my information for personalized communications, targeted advertising, and campaign effectiveness. See the GitHub Privacy Statement for more details.\n\n Back to top", "diff": "@removed_PLACEMARKER_OPEN Sep.18 Improvement@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Copilot code review: An improved review experience@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN copilot@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/70912de0-031b-4491-8949-3cb5a7d9ec3a", "raw_diff": "@removed_PLACEMARKER_OPEN Sep.18 Improvement@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Copilot code review: An improved review experience@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN copilot@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789770082.824303, "prev_snapshot": " Back to blog\n\n\n\n All New Releases Improvements Retired\n Filters ( 0 selected )\n\n\n\n Copilot Clear all\n\n Filters ( 0 selected )\n\n Match: Any All\n Tags\n * Account management\n * Actions\n * Application Security\n * Client apps\n * Collaboration tools\n * Community engagement\n * Copilot\n * Ecosystem & accessibility\n * Enterprise management tools\n * Platform governance\n * Projects & Issues\n * Supply chain security\n * Universe \u201825\n Clear all Apply\n\n\n\n September Sep 2026\n\n Sep.18 Improvement\n\n Copilot code review: An improved review experience\n copilot\n\n Sep.18 Release\n\n GitHub Copilot weekly releases \u2014 September 14\n copilot\n\n Sep.18 Retired\n\n Upcoming deprecation of selected GitHub Copilot models in mid-October\n copilot\n\n Sep.17 Improvement\n\n Copilot impact dashboard now shows feature engagement\n account management copilot enterprise management tools ... +2\n\n Sep.17 Improvement\n\n Agentic CLI customizations now in the usage metrics API\n account management copilot enterprise management tools ... +2\n\n Sep.16 Release\n\n Copilot budget increase requests are generally available\n copilot\n\n Sep.15 Release\n\n GitHub Copilot suggests custom properties definitions\n copilot platform governance ... +1\n\n Sep.14 Release\n\n Configure cost and quality in Copilot auto model selection\n copilot\n\n Sep.11 Improvement\n\n Add VS Code Agents to Copilot usage metrics\n account management copilot enterprise management tools ... +2\n\n Sep.11 Improvement\n\n Auto-resolution and analysis updates in Copilot code review\n copilot\n\n Sep.10 Release\n\n GitHub Copilot weekly releases \u2014 September 7\n copilot\n\n Sep.10 Retired\n\n MAI-Code-1-Flash deprecated\n copilot\n\n Sep.09 Improvement\n\n Enterprise managed permissions for GitHub Copilot agent operations\n client apps copilot enterprise management tools ... +2\n\n Sep.08 Release\n\n Enterprise-managed sandbox in Copilot for JetBrains\n copilot enterprise management tools ... +1\n\n Sep.04 Release\n\n GitHub Copilot weekly releases \u2014 August 31\n copilot\n\n Sep.04 Release\n\n GPT-6 Astra is generally available in GitHub Copilot\n copilot\n\n Sep.03 Retired\n\n Upcoming deprecation of selected GitHub Copilot models\n copilot\n\n Sep.03 Release\n\n Gemini 3.8 Flash is now available in GitHub Copilot\n copilot\n\n Sep.03 Release\n\n Reopening Copilot Business and Enterprise signups\n account management copilot ... +1\n\n Sep.02 Improvement\n\n Enterprise-managed settings support any default model\n client apps copilot enterprise management tools ... +2\n\n Sep.02 Release\n\n Content exclusions generally available in Copilot app and CLI\n copilot\n\n Sep.01 Improvement\n\n Set an expiration date for individual user budgets\n copilot enterprise management tools ... +1\n\n Sep.01 Release\n\n Copilot code review can now approve pull requests\n copilot\n\n Sep.01 Release\n\n Claude Fable 5.1 is generally available in GitHub Copilot\n copilot\n\n August Aug 2026\n\n\n July Jul 2026\n\n\n June Jun 2026\n\n\n May May 2026\n\n\n April Apr 2026\n\n\n March Mar 2026\n\n\n February Feb 2026\n\n\n January Jan 2026\n\n\n Subscribe to our developer newsletter\n\n Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.\n\n Enter your email* Subscribe\n\n By submitting, I agree to let GitHub and its affiliates use my information for personalized communications, targeted advertising, and campaign effectiveness. See the GitHub Privacy Statement for more details.\n\n Back to top", "preview_url": "https://changes.sotzny.net/preview/70912de0-031b-4491-8949-3cb5a7d9ec3a", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "70912de0-031b-4491-8949-3cb5a7d9ec3a", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "", "watch_title": "GitHub Changelog", "watch_url": "https://github.blog/changelog/2026/?label=copilot", "watch_open_url": "https://github.blog/changelog/2026/?label=copilot", "watch_uuid": "70912de0-031b-4491-8949-3cb5a7d9ec3a", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/70912de0-031b-4491-8949-3cb5a7d9ec3a"}}]
- Fri 18 Sep 2026 10:16:16 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://github.blog/changelog/2026/?label=copilot", "body": "https://github.blog/changelog/2026/?label=copilot had a change.\n---\n<b> Sep.18 Improvement</b>\n<b></b>\n<b> Copilot code review: An improved review experience</b>\n<b> copilot</b>\n<b></b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-18 22:16:15 UTC", "current_snapshot": " Back to blog\n\n\n\n All New Releases Improvements Retired\n Filters ( 0 selected )\n\n\n\n Copilot Clear all\n\n Filters ( 0 selected )\n\n Match: Any All\n Tags\n * Account management\n * Actions\n * Application Security\n * Client apps\n * Collaboration tools\n * Community engagement\n * Copilot\n * Ecosystem & accessibility\n * Enterprise management tools\n * Platform governance\n * Projects & Issues\n * Supply chain security\n * Universe \u201825\n Clear all Apply\n\n\n\n September Sep 2026\n\n Sep.18 Improvement\n\n Copilot code review: An improved review experience\n copilot\n\n Sep.18 Release\n\n GitHub Copilot weekly releases \u2014 September 14\n copilot\n\n Sep.18 Retired\n\n Upcoming deprecation of selected GitHub Copilot models in mid-October\n copilot\n\n Sep.17 Improvement\n\n Copilot impact dashboard now shows feature engagement\n account management copilot enterprise management tools ... +2\n\n Sep.17 Improvement\n\n Agentic CLI customizations now in the usage metrics API\n account management copilot enterprise management tools ... +2\n\n Sep.16 Release\n\n Copilot budget increase requests are generally available\n copilot\n\n Sep.15 Release\n\n GitHub Copilot suggests custom properties definitions\n copilot platform governance ... +1\n\n Sep.14 Release\n\n Configure cost and quality in Copilot auto model selection\n copilot\n\n Sep.11 Improvement\n\n Add VS Code Agents to Copilot usage metrics\n account management copilot enterprise management tools ... +2\n\n Sep.11 Improvement\n\n Auto-resolution and analysis updates in Copilot code review\n copilot\n\n Sep.10 Release\n\n GitHub Copilot weekly releases \u2014 September 7\n copilot\n\n Sep.10 Retired\n\n MAI-Code-1-Flash deprecated\n copilot\n\n Sep.09 Improvement\n\n Enterprise managed permissions for GitHub Copilot agent operations\n client apps copilot enterprise management tools ... +2\n\n Sep.08 Release\n\n Enterprise-managed sandbox in Copilot for JetBrains\n copilot enterprise management tools ... +1\n\n Sep.04 Release\n\n GitHub Copilot weekly releases \u2014 August 31\n copilot\n\n Sep.04 Release\n\n GPT-6 Astra is generally available in GitHub Copilot\n copilot\n\n Sep.03 Retired\n\n Upcoming deprecation of selected GitHub Copilot models\n copilot\n\n Sep.03 Release\n\n Gemini 3.8 Flash is now available in GitHub Copilot\n copilot\n\n Sep.03 Release\n\n Reopening Copilot Business and Enterprise signups\n account management copilot ... +1\n\n Sep.02 Improvement\n\n Enterprise-managed settings support any default model\n client apps copilot enterprise management tools ... +2\n\n Sep.02 Release\n\n Content exclusions generally available in Copilot app and CLI\n copilot\n\n Sep.01 Improvement\n\n Set an expiration date for individual user budgets\n copilot enterprise management tools ... +1\n\n Sep.01 Release\n\n Copilot code review can now approve pull requests\n copilot\n\n Sep.01 Release\n\n Claude Fable 5.1 is generally available in GitHub Copilot\n copilot\n\n August Aug 2026\n\n\n July Jul 2026\n\n\n June Jun 2026\n\n\n May May 2026\n\n\n April Apr 2026\n\n\n March Mar 2026\n\n\n February Feb 2026\n\n\n January Jan 2026\n\n\n Subscribe to our developer newsletter\n\n Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.\n\n Enter your email* Subscribe\n\n By submitting, I agree to let GitHub and its affiliates use my information for personalized communications, targeted advertising, and campaign effectiveness. See the GitHub Privacy Statement for more details.\n\n Back to top", "diff": "@added_PLACEMARKER_OPEN Sep.18 Improvement@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Copilot code review: An improved review experience@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN copilot@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/70912de0-031b-4491-8949-3cb5a7d9ec3a", "raw_diff": "@added_PLACEMARKER_OPEN Sep.18 Improvement@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Copilot code review: An improved review experience@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN copilot@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789769775.5512328, "prev_snapshot": " Back to blog\n\n\n\n All New Releases Improvements Retired\n Filters ( 0 selected )\n\n\n\n Copilot Clear all\n\n Filters ( 0 selected )\n\n Match: Any All\n Tags\n * Account management\n * Actions\n * Application Security\n * Client apps\n * Collaboration tools\n * Community engagement\n * Copilot\n * Ecosystem & accessibility\n * Enterprise management tools\n * Platform governance\n * Projects & Issues\n * Supply chain security\n * Universe \u201825\n Clear all Apply\n\n\n\n September Sep 2026\n\n Sep.18 Release\n\n GitHub Copilot weekly releases \u2014 September 14\n copilot\n\n Sep.18 Retired\n\n Upcoming deprecation of selected GitHub Copilot models in mid-October\n copilot\n\n Sep.17 Improvement\n\n Copilot impact dashboard now shows feature engagement\n account management copilot enterprise management tools ... +2\n\n Sep.17 Improvement\n\n Agentic CLI customizations now in the usage metrics API\n account management copilot enterprise management tools ... +2\n\n Sep.16 Release\n\n Copilot budget increase requests are generally available\n copilot\n\n Sep.15 Release\n\n GitHub Copilot suggests custom properties definitions\n copilot platform governance ... +1\n\n Sep.14 Release\n\n Configure cost and quality in Copilot auto model selection\n copilot\n\n Sep.11 Improvement\n\n Add VS Code Agents to Copilot usage metrics\n account management copilot enterprise management tools ... +2\n\n Sep.11 Improvement\n\n Auto-resolution and analysis updates in Copilot code review\n copilot\n\n Sep.10 Release\n\n GitHub Copilot weekly releases \u2014 September 7\n copilot\n\n Sep.10 Retired\n\n MAI-Code-1-Flash deprecated\n copilot\n\n Sep.09 Improvement\n\n Enterprise managed permissions for GitHub Copilot agent operations\n client apps copilot enterprise management tools ... +2\n\n Sep.08 Release\n\n Enterprise-managed sandbox in Copilot for JetBrains\n copilot enterprise management tools ... +1\n\n Sep.04 Release\n\n GitHub Copilot weekly releases \u2014 August 31\n copilot\n\n Sep.04 Release\n\n GPT-6 Astra is generally available in GitHub Copilot\n copilot\n\n Sep.03 Retired\n\n Upcoming deprecation of selected GitHub Copilot models\n copilot\n\n Sep.03 Release\n\n Gemini 3.8 Flash is now available in GitHub Copilot\n copilot\n\n Sep.03 Release\n\n Reopening Copilot Business and Enterprise signups\n account management copilot ... +1\n\n Sep.02 Improvement\n\n Enterprise-managed settings support any default model\n client apps copilot enterprise management tools ... +2\n\n Sep.02 Release\n\n Content exclusions generally available in Copilot app and CLI\n copilot\n\n Sep.01 Improvement\n\n Set an expiration date for individual user budgets\n copilot enterprise management tools ... +1\n\n Sep.01 Release\n\n Copilot code review can now approve pull requests\n copilot\n\n Sep.01 Release\n\n Claude Fable 5.1 is generally available in GitHub Copilot\n copilot\n\n August Aug 2026\n\n\n July Jul 2026\n\n\n June Jun 2026\n\n\n May May 2026\n\n\n April Apr 2026\n\n\n March Mar 2026\n\n\n February Feb 2026\n\n\n January Jan 2026\n\n\n Subscribe to our developer newsletter\n\n Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.\n\n Enter your email* Subscribe\n\n By submitting, I agree to let GitHub and its affiliates use my information for personalized communications, targeted advertising, and campaign effectiveness. See the GitHub Privacy Statement for more details.\n\n Back to top", "preview_url": "https://changes.sotzny.net/preview/70912de0-031b-4491-8949-3cb5a7d9ec3a", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "70912de0-031b-4491-8949-3cb5a7d9ec3a", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "", "watch_title": "GitHub Changelog", "watch_url": "https://github.blog/changelog/2026/?label=copilot", "watch_open_url": "https://github.blog/changelog/2026/?label=copilot", "watch_uuid": "70912de0-031b-4491-8949-3cb5a7d9ec3a", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/70912de0-031b-4491-8949-3cb5a7d9ec3a"}}]
- Fri 18 Sep 2026 08:15:42 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://github.blog/changelog/2026/?label=copilot", "body": "https://github.blog/changelog/2026/?label=copilot had a change.\n---\n<b> Sep.18 Release</b>\n<b></b>\n<b> GitHub Copilot weekly releases \u2014 September 14</b>\n<b> copilot</b>\n<b></b>\n<b> Sep.18 Retired</b>\n<b></b>\n<b> Upcoming deprecation of selected GitHub Copilot models in mid-October</b>\n<b> copilot</b>\n<b></b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-18 20:15:41 UTC", "current_snapshot": " Back to blog\n\n\n\n All New Releases Improvements Retired\n Filters ( 0 selected )\n\n\n\n Copilot Clear all\n\n Filters ( 0 selected )\n\n Match: Any All\n Tags\n * Account management\n * Actions\n * Application Security\n * Client apps\n * Collaboration tools\n * Community engagement\n * Copilot\n * Ecosystem & accessibility\n * Enterprise management tools\n * Platform governance\n * Projects & Issues\n * Supply chain security\n * Universe \u201825\n Clear all Apply\n\n\n\n September Sep 2026\n\n Sep.18 Release\n\n GitHub Copilot weekly releases \u2014 September 14\n copilot\n\n Sep.18 Retired\n\n Upcoming deprecation of selected GitHub Copilot models in mid-October\n copilot\n\n Sep.17 Improvement\n\n Copilot impact dashboard now shows feature engagement\n account management copilot enterprise management tools ... +2\n\n Sep.17 Improvement\n\n Agentic CLI customizations now in the usage metrics API\n account management copilot enterprise management tools ... +2\n\n Sep.16 Release\n\n Copilot budget increase requests are generally available\n copilot\n\n Sep.15 Release\n\n GitHub Copilot suggests custom properties definitions\n copilot platform governance ... +1\n\n Sep.14 Release\n\n Configure cost and quality in Copilot auto model selection\n copilot\n\n Sep.11 Improvement\n\n Add VS Code Agents to Copilot usage metrics\n account management copilot enterprise management tools ... +2\n\n Sep.11 Improvement\n\n Auto-resolution and analysis updates in Copilot code review\n copilot\n\n Sep.10 Release\n\n GitHub Copilot weekly releases \u2014 September 7\n copilot\n\n Sep.10 Retired\n\n MAI-Code-1-Flash deprecated\n copilot\n\n Sep.09 Improvement\n\n Enterprise managed permissions for GitHub Copilot agent operations\n client apps copilot enterprise management tools ... +2\n\n Sep.08 Release\n\n Enterprise-managed sandbox in Copilot for JetBrains\n copilot enterprise management tools ... +1\n\n Sep.04 Release\n\n GitHub Copilot weekly releases \u2014 August 31\n copilot\n\n Sep.04 Release\n\n GPT-6 Astra is generally available in GitHub Copilot\n copilot\n\n Sep.03 Retired\n\n Upcoming deprecation of selected GitHub Copilot models\n copilot\n\n Sep.03 Release\n\n Gemini 3.8 Flash is now available in GitHub Copilot\n copilot\n\n Sep.03 Release\n\n Reopening Copilot Business and Enterprise signups\n account management copilot ... +1\n\n Sep.02 Improvement\n\n Enterprise-managed settings support any default model\n client apps copilot enterprise management tools ... +2\n\n Sep.02 Release\n\n Content exclusions generally available in Copilot app and CLI\n copilot\n\n Sep.01 Improvement\n\n Set an expiration date for individual user budgets\n copilot enterprise management tools ... +1\n\n Sep.01 Release\n\n Copilot code review can now approve pull requests\n copilot\n\n Sep.01 Release\n\n Claude Fable 5.1 is generally available in GitHub Copilot\n copilot\n\n August Aug 2026\n\n\n July Jul 2026\n\n\n June Jun 2026\n\n\n May May 2026\n\n\n April Apr 2026\n\n\n March Mar 2026\n\n\n February Feb 2026\n\n\n January Jan 2026\n\n\n Subscribe to our developer newsletter\n\n Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.\n\n Enter your email* Subscribe\n\n By submitting, I agree to let GitHub and its affiliates use my information for personalized communications, targeted advertising, and campaign effectiveness. See the GitHub Privacy Statement for more details.\n\n Back to top", "diff": "@added_PLACEMARKER_OPEN Sep.18 Release@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN GitHub Copilot weekly releases \u2014 September 14@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN copilot@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Sep.18 Retired@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Upcoming deprecation of selected GitHub Copilot models in mid-October@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN copilot@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/70912de0-031b-4491-8949-3cb5a7d9ec3a", "raw_diff": "@added_PLACEMARKER_OPEN Sep.18 Release@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN GitHub Copilot weekly releases \u2014 September 14@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN copilot@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Sep.18 Retired@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Upcoming deprecation of selected GitHub Copilot models in mid-October@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN copilot@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789762541.5356495, "prev_snapshot": " Back to blog\n\n\n\n All New Releases Improvements Retired\n Filters ( 0 selected )\n\n\n\n Copilot Clear all\n\n Filters ( 0 selected )\n\n Match: Any All\n Tags\n * Account management\n * Actions\n * Application Security\n * Client apps\n * Collaboration tools\n * Community engagement\n * Copilot\n * Ecosystem & accessibility\n * Enterprise management tools\n * Platform governance\n * Projects & Issues\n * Supply chain security\n * Universe \u201825\n Clear all Apply\n\n\n\n September Sep 2026\n\n Sep.17 Improvement\n\n Copilot impact dashboard now shows feature engagement\n account management copilot enterprise management tools ... +2\n\n Sep.17 Improvement\n\n Agentic CLI customizations now in the usage metrics API\n account management copilot enterprise management tools ... +2\n\n Sep.16 Release\n\n Copilot budget increase requests are generally available\n copilot\n\n Sep.15 Release\n\n GitHub Copilot suggests custom properties definitions\n copilot platform governance ... +1\n\n Sep.14 Release\n\n Configure cost and quality in Copilot auto model selection\n copilot\n\n Sep.11 Improvement\n\n Add VS Code Agents to Copilot usage metrics\n account management copilot enterprise management tools ... +2\n\n Sep.11 Improvement\n\n Auto-resolution and analysis updates in Copilot code review\n copilot\n\n Sep.10 Release\n\n GitHub Copilot weekly releases \u2014 September 7\n copilot\n\n Sep.10 Retired\n\n MAI-Code-1-Flash deprecated\n copilot\n\n Sep.09 Improvement\n\n Enterprise managed permissions for GitHub Copilot agent operations\n client apps copilot enterprise management tools ... +2\n\n Sep.08 Release\n\n Enterprise-managed sandbox in Copilot for JetBrains\n copilot enterprise management tools ... +1\n\n Sep.04 Release\n\n GitHub Copilot weekly releases \u2014 August 31\n copilot\n\n Sep.04 Release\n\n GPT-6 Astra is generally available in GitHub Copilot\n copilot\n\n Sep.03 Retired\n\n Upcoming deprecation of selected GitHub Copilot models\n copilot\n\n Sep.03 Release\n\n Gemini 3.8 Flash is now available in GitHub Copilot\n copilot\n\n Sep.03 Release\n\n Reopening Copilot Business and Enterprise signups\n account management copilot ... +1\n\n Sep.02 Improvement\n\n Enterprise-managed settings support any default model\n client apps copilot enterprise management tools ... +2\n\n Sep.02 Release\n\n Content exclusions generally available in Copilot app and CLI\n copilot\n\n Sep.01 Improvement\n\n Set an expiration date for individual user budgets\n copilot enterprise management tools ... +1\n\n Sep.01 Release\n\n Copilot code review can now approve pull requests\n copilot\n\n Sep.01 Release\n\n Claude Fable 5.1 is generally available in GitHub Copilot\n copilot\n\n August Aug 2026\n\n\n July Jul 2026\n\n\n June Jun 2026\n\n\n May May 2026\n\n\n April Apr 2026\n\n\n March Mar 2026\n\n\n February Feb 2026\n\n\n January Jan 2026\n\n\n Subscribe to our developer newsletter\n\n Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.\n\n Enter your email* Subscribe\n\n By submitting, I agree to let GitHub and its affiliates use my information for personalized communications, targeted advertising, and campaign effectiveness. See the GitHub Privacy Statement for more details.\n\n Back to top", "preview_url": "https://changes.sotzny.net/preview/70912de0-031b-4491-8949-3cb5a7d9ec3a", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "70912de0-031b-4491-8949-3cb5a7d9ec3a", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "", "watch_title": "GitHub Changelog", "watch_url": "https://github.blog/changelog/2026/?label=copilot", "watch_open_url": "https://github.blog/changelog/2026/?label=copilot", "watch_uuid": "70912de0-031b-4491-8949-3cb5a7d9ec3a", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/70912de0-031b-4491-8949-3cb5a7d9ec3a"}}]
- Fri 18 Sep 2026 08:05:45 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://github.blog/changelog/2026/?label=copilot", "body": "https://github.blog/changelog/2026/?label=copilot had a change.\n---\n<s> Sep.18 Release</s>\n<s></s>\n<s> GitHub Copilot weekly releases \u2014 September 14</s>\n<s> copilot</s>\n<s></s>\n<s> Sep.18 Retired</s>\n<s></s>\n<s> Upcoming deprecation of selected GitHub Copilot models in mid-October</s>\n<s> copilot</s>\n<s></s>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-18 20:05:45 UTC", "current_snapshot": " Back to blog\n\n\n\n All New Releases Improvements Retired\n Filters ( 0 selected )\n\n\n\n Copilot Clear all\n\n Filters ( 0 selected )\n\n Match: Any All\n Tags\n * Account management\n * Actions\n * Application Security\n * Client apps\n * Collaboration tools\n * Community engagement\n * Copilot\n * Ecosystem & accessibility\n * Enterprise management tools\n * Platform governance\n * Projects & Issues\n * Supply chain security\n * Universe \u201825\n Clear all Apply\n\n\n\n September Sep 2026\n\n Sep.17 Improvement\n\n Copilot impact dashboard now shows feature engagement\n account management copilot enterprise management tools ... +2\n\n Sep.17 Improvement\n\n Agentic CLI customizations now in the usage metrics API\n account management copilot enterprise management tools ... +2\n\n Sep.16 Release\n\n Copilot budget increase requests are generally available\n copilot\n\n Sep.15 Release\n\n GitHub Copilot suggests custom properties definitions\n copilot platform governance ... +1\n\n Sep.14 Release\n\n Configure cost and quality in Copilot auto model selection\n copilot\n\n Sep.11 Improvement\n\n Add VS Code Agents to Copilot usage metrics\n account management copilot enterprise management tools ... +2\n\n Sep.11 Improvement\n\n Auto-resolution and analysis updates in Copilot code review\n copilot\n\n Sep.10 Release\n\n GitHub Copilot weekly releases \u2014 September 7\n copilot\n\n Sep.10 Retired\n\n MAI-Code-1-Flash deprecated\n copilot\n\n Sep.09 Improvement\n\n Enterprise managed permissions for GitHub Copilot agent operations\n client apps copilot enterprise management tools ... +2\n\n Sep.08 Release\n\n Enterprise-managed sandbox in Copilot for JetBrains\n copilot enterprise management tools ... +1\n\n Sep.04 Release\n\n GitHub Copilot weekly releases \u2014 August 31\n copilot\n\n Sep.04 Release\n\n GPT-6 Astra is generally available in GitHub Copilot\n copilot\n\n Sep.03 Retired\n\n Upcoming deprecation of selected GitHub Copilot models\n copilot\n\n Sep.03 Release\n\n Gemini 3.8 Flash is now available in GitHub Copilot\n copilot\n\n Sep.03 Release\n\n Reopening Copilot Business and Enterprise signups\n account management copilot ... +1\n\n Sep.02 Improvement\n\n Enterprise-managed settings support any default model\n client apps copilot enterprise management tools ... +2\n\n Sep.02 Release\n\n Content exclusions generally available in Copilot app and CLI\n copilot\n\n Sep.01 Improvement\n\n Set an expiration date for individual user budgets\n copilot enterprise management tools ... +1\n\n Sep.01 Release\n\n Copilot code review can now approve pull requests\n copilot\n\n Sep.01 Release\n\n Claude Fable 5.1 is generally available in GitHub Copilot\n copilot\n\n August Aug 2026\n\n\n July Jul 2026\n\n\n June Jun 2026\n\n\n May May 2026\n\n\n April Apr 2026\n\n\n March Mar 2026\n\n\n February Feb 2026\n\n\n January Jan 2026\n\n\n Subscribe to our developer newsletter\n\n Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.\n\n Enter your email* Subscribe\n\n By submitting, I agree to let GitHub and its affiliates use my information for personalized communications, targeted advertising, and campaign effectiveness. See the GitHub Privacy Statement for more details.\n\n Back to top", "diff": "@removed_PLACEMARKER_OPEN Sep.18 Release@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN GitHub Copilot weekly releases \u2014 September 14@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN copilot@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Sep.18 Retired@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Upcoming deprecation of selected GitHub Copilot models in mid-October@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN copilot@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/70912de0-031b-4491-8949-3cb5a7d9ec3a", "raw_diff": "@removed_PLACEMARKER_OPEN Sep.18 Release@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN GitHub Copilot weekly releases \u2014 September 14@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN copilot@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Sep.18 Retired@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Upcoming deprecation of selected GitHub Copilot models in mid-October@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN copilot@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789761945.0238805, "prev_snapshot": " Back to blog\n\n\n\n All New Releases Improvements Retired\n Filters ( 0 selected )\n\n\n\n Copilot Clear all\n\n Filters ( 0 selected )\n\n Match: Any All\n Tags\n * Account management\n * Actions\n * Application Security\n * Client apps\n * Collaboration tools\n * Community engagement\n * Copilot\n * Ecosystem & accessibility\n * Enterprise management tools\n * Platform governance\n * Projects & Issues\n * Supply chain security\n * Universe \u201825\n Clear all Apply\n\n\n\n September Sep 2026\n\n Sep.18 Release\n\n GitHub Copilot weekly releases \u2014 September 14\n copilot\n\n Sep.18 Retired\n\n Upcoming deprecation of selected GitHub Copilot models in mid-October\n copilot\n\n Sep.17 Improvement\n\n Copilot impact dashboard now shows feature engagement\n account management copilot enterprise management tools ... +2\n\n Sep.17 Improvement\n\n Agentic CLI customizations now in the usage metrics API\n account management copilot enterprise management tools ... +2\n\n Sep.16 Release\n\n Copilot budget increase requests are generally available\n copilot\n\n Sep.15 Release\n\n GitHub Copilot suggests custom properties definitions\n copilot platform governance ... +1\n\n Sep.14 Release\n\n Configure cost and quality in Copilot auto model selection\n copilot\n\n Sep.11 Improvement\n\n Add VS Code Agents to Copilot usage metrics\n account management copilot enterprise management tools ... +2\n\n Sep.11 Improvement\n\n Auto-resolution and analysis updates in Copilot code review\n copilot\n\n Sep.10 Release\n\n GitHub Copilot weekly releases \u2014 September 7\n copilot\n\n Sep.10 Retired\n\n MAI-Code-1-Flash deprecated\n copilot\n\n Sep.09 Improvement\n\n Enterprise managed permissions for GitHub Copilot agent operations\n client apps copilot enterprise management tools ... +2\n\n Sep.08 Release\n\n Enterprise-managed sandbox in Copilot for JetBrains\n copilot enterprise management tools ... +1\n\n Sep.04 Release\n\n GitHub Copilot weekly releases \u2014 August 31\n copilot\n\n Sep.04 Release\n\n GPT-6 Astra is generally available in GitHub Copilot\n copilot\n\n Sep.03 Retired\n\n Upcoming deprecation of selected GitHub Copilot models\n copilot\n\n Sep.03 Release\n\n Gemini 3.8 Flash is now available in GitHub Copilot\n copilot\n\n Sep.03 Release\n\n Reopening Copilot Business and Enterprise signups\n account management copilot ... +1\n\n Sep.02 Improvement\n\n Enterprise-managed settings support any default model\n client apps copilot enterprise management tools ... +2\n\n Sep.02 Release\n\n Content exclusions generally available in Copilot app and CLI\n copilot\n\n Sep.01 Improvement\n\n Set an expiration date for individual user budgets\n copilot enterprise management tools ... +1\n\n Sep.01 Release\n\n Copilot code review can now approve pull requests\n copilot\n\n Sep.01 Release\n\n Claude Fable 5.1 is generally available in GitHub Copilot\n copilot\n\n August Aug 2026\n\n\n July Jul 2026\n\n\n June Jun 2026\n\n\n May May 2026\n\n\n April Apr 2026\n\n\n March Mar 2026\n\n\n February Feb 2026\n\n\n January Jan 2026\n\n\n Subscribe to our developer newsletter\n\n Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.\n\n Enter your email* Subscribe\n\n By submitting, I agree to let GitHub and its affiliates use my information for personalized communications, targeted advertising, and campaign effectiveness. See the GitHub Privacy Statement for more details.\n\n Back to top", "preview_url": "https://changes.sotzny.net/preview/70912de0-031b-4491-8949-3cb5a7d9ec3a", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "70912de0-031b-4491-8949-3cb5a7d9ec3a", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "", "watch_title": "GitHub Changelog", "watch_url": "https://github.blog/changelog/2026/?label=copilot", "watch_open_url": "https://github.blog/changelog/2026/?label=copilot", "watch_uuid": "70912de0-031b-4491-8949-3cb5a7d9ec3a", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/70912de0-031b-4491-8949-3cb5a7d9ec3a"}}]
- Fri 18 Sep 2026 08:00:54 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://github.blog/changelog/2026/?label=copilot", "body": "https://github.blog/changelog/2026/?label=copilot had a change.\n---\n<b> Sep.18 Release</b>\n<b></b>\n<b> GitHub Copilot weekly releases \u2014 September 14</b>\n<b> copilot</b>\n<b></b>\n<b> Sep.18 Retired</b>\n<b></b>\n<b> Upcoming deprecation of selected GitHub Copilot models in mid-October</b>\n<b> copilot</b>\n<b></b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-18 20:00:54 UTC", "current_snapshot": " Back to blog\n\n\n\n All New Releases Improvements Retired\n Filters ( 0 selected )\n\n\n\n Copilot Clear all\n\n Filters ( 0 selected )\n\n Match: Any All\n Tags\n * Account management\n * Actions\n * Application Security\n * Client apps\n * Collaboration tools\n * Community engagement\n * Copilot\n * Ecosystem & accessibility\n * Enterprise management tools\n * Platform governance\n * Projects & Issues\n * Supply chain security\n * Universe \u201825\n Clear all Apply\n\n\n\n September Sep 2026\n\n Sep.18 Release\n\n GitHub Copilot weekly releases \u2014 September 14\n copilot\n\n Sep.18 Retired\n\n Upcoming deprecation of selected GitHub Copilot models in mid-October\n copilot\n\n Sep.17 Improvement\n\n Copilot impact dashboard now shows feature engagement\n account management copilot enterprise management tools ... +2\n\n Sep.17 Improvement\n\n Agentic CLI customizations now in the usage metrics API\n account management copilot enterprise management tools ... +2\n\n Sep.16 Release\n\n Copilot budget increase requests are generally available\n copilot\n\n Sep.15 Release\n\n GitHub Copilot suggests custom properties definitions\n copilot platform governance ... +1\n\n Sep.14 Release\n\n Configure cost and quality in Copilot auto model selection\n copilot\n\n Sep.11 Improvement\n\n Add VS Code Agents to Copilot usage metrics\n account management copilot enterprise management tools ... +2\n\n Sep.11 Improvement\n\n Auto-resolution and analysis updates in Copilot code review\n copilot\n\n Sep.10 Release\n\n GitHub Copilot weekly releases \u2014 September 7\n copilot\n\n Sep.10 Retired\n\n MAI-Code-1-Flash deprecated\n copilot\n\n Sep.09 Improvement\n\n Enterprise managed permissions for GitHub Copilot agent operations\n client apps copilot enterprise management tools ... +2\n\n Sep.08 Release\n\n Enterprise-managed sandbox in Copilot for JetBrains\n copilot enterprise management tools ... +1\n\n Sep.04 Release\n\n GitHub Copilot weekly releases \u2014 August 31\n copilot\n\n Sep.04 Release\n\n GPT-6 Astra is generally available in GitHub Copilot\n copilot\n\n Sep.03 Retired\n\n Upcoming deprecation of selected GitHub Copilot models\n copilot\n\n Sep.03 Release\n\n Gemini 3.8 Flash is now available in GitHub Copilot\n copilot\n\n Sep.03 Release\n\n Reopening Copilot Business and Enterprise signups\n account management copilot ... +1\n\n Sep.02 Improvement\n\n Enterprise-managed settings support any default model\n client apps copilot enterprise management tools ... +2\n\n Sep.02 Release\n\n Content exclusions generally available in Copilot app and CLI\n copilot\n\n Sep.01 Improvement\n\n Set an expiration date for individual user budgets\n copilot enterprise management tools ... +1\n\n Sep.01 Release\n\n Copilot code review can now approve pull requests\n copilot\n\n Sep.01 Release\n\n Claude Fable 5.1 is generally available in GitHub Copilot\n copilot\n\n August Aug 2026\n\n\n July Jul 2026\n\n\n June Jun 2026\n\n\n May May 2026\n\n\n April Apr 2026\n\n\n March Mar 2026\n\n\n February Feb 2026\n\n\n January Jan 2026\n\n\n Subscribe to our developer newsletter\n\n Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.\n\n Enter your email* Subscribe\n\n By submitting, I agree to let GitHub and its affiliates use my information for personalized communications, targeted advertising, and campaign effectiveness. See the GitHub Privacy Statement for more details.\n\n Back to top", "diff": "@added_PLACEMARKER_OPEN Sep.18 Release@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN GitHub Copilot weekly releases \u2014 September 14@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN copilot@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Sep.18 Retired@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Upcoming deprecation of selected GitHub Copilot models in mid-October@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN copilot@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/70912de0-031b-4491-8949-3cb5a7d9ec3a", "raw_diff": "@added_PLACEMARKER_OPEN Sep.18 Release@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN GitHub Copilot weekly releases \u2014 September 14@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN copilot@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Sep.18 Retired@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Upcoming deprecation of selected GitHub Copilot models in mid-October@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN copilot@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789761653.8299007, "prev_snapshot": " Back to blog\n\n\n\n All New Releases Improvements Retired\n Filters ( 0 selected )\n\n\n\n Copilot Clear all\n\n Filters ( 0 selected )\n\n Match: Any All\n Tags\n * Account management\n * Actions\n * Application Security\n * Client apps\n * Collaboration tools\n * Community engagement\n * Copilot\n * Ecosystem & accessibility\n * Enterprise management tools\n * Platform governance\n * Projects & Issues\n * Supply chain security\n * Universe \u201825\n Clear all Apply\n\n\n\n September Sep 2026\n\n Sep.17 Improvement\n\n Copilot impact dashboard now shows feature engagement\n account management copilot enterprise management tools ... +2\n\n Sep.17 Improvement\n\n Agentic CLI customizations now in the usage metrics API\n account management copilot enterprise management tools ... +2\n\n Sep.16 Release\n\n Copilot budget increase requests are generally available\n copilot\n\n Sep.15 Release\n\n GitHub Copilot suggests custom properties definitions\n copilot platform governance ... +1\n\n Sep.14 Release\n\n Configure cost and quality in Copilot auto model selection\n copilot\n\n Sep.11 Improvement\n\n Add VS Code Agents to Copilot usage metrics\n account management copilot enterprise management tools ... +2\n\n Sep.11 Improvement\n\n Auto-resolution and analysis updates in Copilot code review\n copilot\n\n Sep.10 Release\n\n GitHub Copilot weekly releases \u2014 September 7\n copilot\n\n Sep.10 Retired\n\n MAI-Code-1-Flash deprecated\n copilot\n\n Sep.09 Improvement\n\n Enterprise managed permissions for GitHub Copilot agent operations\n client apps copilot enterprise management tools ... +2\n\n Sep.08 Release\n\n Enterprise-managed sandbox in Copilot for JetBrains\n copilot enterprise management tools ... +1\n\n Sep.04 Release\n\n GitHub Copilot weekly releases \u2014 August 31\n copilot\n\n Sep.04 Release\n\n GPT-6 Astra is generally available in GitHub Copilot\n copilot\n\n Sep.03 Retired\n\n Upcoming deprecation of selected GitHub Copilot models\n copilot\n\n Sep.03 Release\n\n Gemini 3.8 Flash is now available in GitHub Copilot\n copilot\n\n Sep.03 Release\n\n Reopening Copilot Business and Enterprise signups\n account management copilot ... +1\n\n Sep.02 Improvement\n\n Enterprise-managed settings support any default model\n client apps copilot enterprise management tools ... +2\n\n Sep.02 Release\n\n Content exclusions generally available in Copilot app and CLI\n copilot\n\n Sep.01 Improvement\n\n Set an expiration date for individual user budgets\n copilot enterprise management tools ... +1\n\n Sep.01 Release\n\n Copilot code review can now approve pull requests\n copilot\n\n Sep.01 Release\n\n Claude Fable 5.1 is generally available in GitHub Copilot\n copilot\n\n August Aug 2026\n\n\n July Jul 2026\n\n\n June Jun 2026\n\n\n May May 2026\n\n\n April Apr 2026\n\n\n March Mar 2026\n\n\n February Feb 2026\n\n\n January Jan 2026\n\n\n Subscribe to our developer newsletter\n\n Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.\n\n Enter your email* Subscribe\n\n By submitting, I agree to let GitHub and its affiliates use my information for personalized communications, targeted advertising, and campaign effectiveness. See the GitHub Privacy Statement for more details.\n\n Back to top", "preview_url": "https://changes.sotzny.net/preview/70912de0-031b-4491-8949-3cb5a7d9ec3a", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "70912de0-031b-4491-8949-3cb5a7d9ec3a", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "", "watch_title": "GitHub Changelog", "watch_url": "https://github.blog/changelog/2026/?label=copilot", "watch_open_url": "https://github.blog/changelog/2026/?label=copilot", "watch_uuid": "70912de0-031b-4491-8949-3cb5a7d9ec3a", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/70912de0-031b-4491-8949-3cb5a7d9ec3a"}}]
- Fri 18 Sep 2026 06:46:25 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://www.ncn-festival.de/programm/running-order/", "body": "https://www.ncn-festival.de/programm/running-order/ had a change.\n---\n<b></b>\n<b> Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.</b>\n<b></b>\n<b> Datenschutzeinstellungen</b>\n<b></b>\n<b> Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.</b>\n<b></b>\n<b> Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.</b>\n<b></b>\n<b> Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.</b>\n<b></b>\n<b> Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.</b>\n<b></b>\n<b> Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.</b>\n<b></b>\n<b> Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.</b>\n<b></b>\n<b> Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.</b>\n<b></b>\n<b> Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.</b>\n<b></b>\n<b> Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.</b>\n<b></b>\n<b> Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.</b>\n<b> * Essenziell</b>\n<b> * Statistiken</b>\n<b> * Externe Medien</b>\n<b> Speichern</b>\n<b> Alle akzeptieren</b>\n<b> Individuelle Datenschutzeinstellungen</b>\n<b> Cookie-DetailsDatenschutzerkl\u00e4rungImpressum</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-18 18:44:18 UTC", "current_snapshot": " * \n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n Seite w\u00e4hlen\n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n * \n\n Running Order\n\n Line-Up\n Running Order\n Warm Up Party\n Rahmenprogramm\n\n Running Order\n\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n\n Partner\n\n Impressum | AGB | Datenschutzerkl\u00e4rung\n\n Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.\n\n Datenschutzeinstellungen\n\n Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.\n\n Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.\n\n Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.\n\n Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.\n\n Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.\n\n Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.\n\n Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.\n\n Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.\n\n Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.\n\n Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.\n * Essenziell\n * Statistiken\n * Externe Medien\n Speichern\n Alle akzeptieren\n Individuelle Datenschutzeinstellungen\n Cookie-DetailsDatenschutzerkl\u00e4rungImpressum", "diff": "@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Datenschutzeinstellungen@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN * Essenziell@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN * Statistiken@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN * Externe Medien@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Speichern@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Alle akzeptieren@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Individuelle Datenschutzeinstellungen@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Cookie-DetailsDatenschutzerkl\u00e4rungImpressum@added_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/31236833-eee3-46d2-aced-ccae65da8032", "raw_diff": "@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Datenschutzeinstellungen@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN * Essenziell@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN * Statistiken@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN * Externe Medien@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Speichern@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Alle akzeptieren@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Individuelle Datenschutzeinstellungen@added_PLACEMARKER_CLOSED\n@added_PLACEMARKER_OPEN Cookie-DetailsDatenschutzerkl\u00e4rungImpressum@added_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789757184.6350126, "prev_snapshot": " * \n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n Seite w\u00e4hlen\n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n * \n\n Running Order\n\n Line-Up\n Running Order\n Warm Up Party\n Rahmenprogramm\n\n Running Order\n\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n\n Partner\n\n Impressum | AGB | Datenschutzerkl\u00e4rung\n", "preview_url": "https://changes.sotzny.net/preview/31236833-eee3-46d2-aced-ccae65da8032", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "31236833-eee3-46d2-aced-ccae65da8032", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "NCN", "watch_title": "Running Order - NCN Festival", "watch_url": "https://www.ncn-festival.de/programm/running-order/", "watch_open_url": "https://www.ncn-festival.de/programm/running-order/", "watch_uuid": "31236833-eee3-46d2-aced-ccae65da8032", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/31236833-eee3-46d2-aced-ccae65da8032"}}]
- Fri 18 Sep 2026 03:08:41 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://changedetection.io/CHANGELOG.txt", "body": "https://changedetection.io/CHANGELOG.txt had a change.\n---\n<s>HEAD / 2026-09-18 13:56:25 +0200:</s>\n<b>HEAD / 2026-09-18 15:22:24 +0200:</b>\n<b> - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)</b>\n<b> - UI - sidebar - background fixes</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-18 15:08:40 UTC", "current_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-18 15:22:24 +0200:\n - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)\n - UI - sidebar - background fixes\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-18 13:56:25 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-18 15:22:24 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI - sidebar - background fixes@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/308c5c76-e290-4660-9296-62bcf1731735", "raw_diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-18 13:56:25 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-18 15:22:24 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI - sidebar - background fixes@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789744121.4336348, "prev_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-18 13:56:25 +0200:\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "preview_url": "https://changes.sotzny.net/preview/308c5c76-e290-4660-9296-62bcf1731735", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "308c5c76-e290-4660-9296-62bcf1731735", "watch_mime_type": "text/plain", "watch_tag": "changedetection.io", "watch_title": "https://changedetection.io/CHANGELOG.txt", "watch_url": "https://changedetection.io/CHANGELOG.txt", "watch_open_url": "https://changedetection.io/CHANGELOG.txt", "watch_uuid": "308c5c76-e290-4660-9296-62bcf1731735", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/308c5c76-e290-4660-9296-62bcf1731735"}}]
- Fri 18 Sep 2026 02:46:37 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://www.ncn-festival.de/programm/running-order/", "body": "https://www.ncn-festival.de/programm/running-order/ had a change.\n---\n<s></s>\n<s> Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.</s>\n<s></s>\n<s> Datenschutzeinstellungen</s>\n<s></s>\n<s> Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.</s>\n<s></s>\n<s> Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.</s>\n<s></s>\n<s> Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.</s>\n<s></s>\n<s> Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.</s>\n<s></s>\n<s> Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.</s>\n<s></s>\n<s> Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.</s>\n<s></s>\n<s> Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.</s>\n<s></s>\n<s> Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.</s>\n<s></s>\n<s> Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.</s>\n<s></s>\n<s> Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.</s>\n<s> * Essenziell</s>\n<s> * Statistiken</s>\n<s> * Externe Medien</s>\n<s> Speichern</s>\n<s> Alle akzeptieren</s>\n<s> Individuelle Datenschutzeinstellungen</s>\n<s> Cookie-DetailsDatenschutzerkl\u00e4rungImpressum</s>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-18 14:44:27 UTC", "current_snapshot": " * \n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n Seite w\u00e4hlen\n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n * \n\n Running Order\n\n Line-Up\n Running Order\n Warm Up Party\n Rahmenprogramm\n\n Running Order\n\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n\n Partner\n\n Impressum | AGB | Datenschutzerkl\u00e4rung\n", "diff": "@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Datenschutzeinstellungen@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN * Essenziell@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN * Statistiken@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN * Externe Medien@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Speichern@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Alle akzeptieren@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Individuelle Datenschutzeinstellungen@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Cookie-DetailsDatenschutzerkl\u00e4rungImpressum@removed_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/31236833-eee3-46d2-aced-ccae65da8032", "raw_diff": "@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Datenschutzeinstellungen@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN * Essenziell@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN * Statistiken@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN * Externe Medien@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Speichern@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Alle akzeptieren@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Individuelle Datenschutzeinstellungen@removed_PLACEMARKER_CLOSED\n@removed_PLACEMARKER_OPEN Cookie-DetailsDatenschutzerkl\u00e4rungImpressum@removed_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789742796.824029, "prev_snapshot": " * \n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n Seite w\u00e4hlen\n * Programm\n + Line-Up\n + Running Order\n + Warm Up Party\n + Rahmenprogramm\n o Aftershowpartys\n o Leseb\u00fchne\n o Fotoecke\n o Schwarze H\u00fcpfburg\n * Location\n + Lageplan Festival\n + B\u00fchnen\n + Kulturpark Deutzen\n * Informationen\n + \u00d6ffnungszeiten\n + Anreise\n o Mit Auto\n o Mit Bahn\n o Mit Flugzeug\n o Mit Bus\n o Mitfahrgelegenheiten\n + Parkplatz\n o P1 & P2 \u2013 f\u00fcr PKW\n o P3 \u2013 f\u00fcr PKW & Wohnmobile\n o WoMo-Parkplatz\n + \u00dcbernachtung\n o Campingplatz\n o Holzh\u00fctten\n o Mein Zelt Steht Schon\n o Hotel & Pensionen\n + Gastronomie\n + Anfragen\n o Bands\n o Caterer\n o H\u00e4ndler\n + Presse\n o Akkreditierung\n o Downloads\n * Historie\n * Tickets\n + NCN Shop\n + Tix For Gigs\n * \n\n Running Order\n\n Line-Up\n Running Order\n Warm Up Party\n Rahmenprogramm\n\n Running Order\n\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n * Folgen\n\n Partner\n\n Impressum | AGB | Datenschutzerkl\u00e4rung\n\n Mit diesem Button wird der Dialog geschlossen. Seine Funktionalit\u00e4t ist identisch mit der des Buttons Nur essenzielle Cookies akzeptieren.\n\n Datenschutzeinstellungen\n\n Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.\n\n Wenn Sie unter 16 Jahre alt sind und Ihre Einwilligung zu optionalen Services geben m\u00f6chten, m\u00fcssen Sie Ihre Erziehungsberechtigten um Erlaubnis bitten.\n\n Wir verwenden Cookies und andere Technologien auf unserer Website. Einige von ihnen sind essenziell, w\u00e4hrend andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.\n\n Personenbezogene Daten k\u00f6nnen verarbeitet werden (z. B. IP-Adressen), z. B. f\u00fcr personalisierte Anzeigen und Inhalte oder die Messung von Anzeigen und Inhalten.\n\n Weitere Informationen \u00fcber die Verwendung Ihrer Daten finden Sie in unserer Datenschutzerkl\u00e4rung.\n\n Es besteht keine Verpflichtung, in die Verarbeitung Ihrer Daten einzuwilligen, um dieses Angebot zu nutzen.\n\n Sie k\u00f6nnen Ihre Auswahl jederzeit unter Einstellungen widerrufen oder anpassen.\n\n Bitte beachten Sie, dass aufgrund individueller Einstellungen m\u00f6glicherweise nicht alle Funktionen der Website verf\u00fcgbar sind.\n\n Einige Services verarbeiten personenbezogene Daten in den USA. Mit Ihrer Einwilligung zur Nutzung dieser Services willigen Sie auch in die Verarbeitung Ihrer Daten in den USA gem\u00e4\u00df Art. 49 (1) lit. a GDPR ein. Der EuGH stuft die USA als ein Land mit unzureichendem Datenschutz nach EU-Standards ein. Es besteht beispielsweise die Gefahr, dass US-Beh\u00f6rden personenbezogene Daten in \u00dcberwachungsprogrammen verarbeiten, ohne dass f\u00fcr Europ\u00e4erinnen und Europ\u00e4er eine Klagem\u00f6glichkeit besteht.\n\n Es folgt eine Liste der Service-Gruppen, f\u00fcr die eine Einwilligung erteilt werden kann. Die erste Service-Gruppe ist essenziell und kann nicht abgew\u00e4hlt werden.\n * Essenziell\n * Statistiken\n * Externe Medien\n Speichern\n Alle akzeptieren\n Individuelle Datenschutzeinstellungen\n Cookie-DetailsDatenschutzerkl\u00e4rungImpressum", "preview_url": "https://changes.sotzny.net/preview/31236833-eee3-46d2-aced-ccae65da8032", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "31236833-eee3-46d2-aced-ccae65da8032", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "NCN", "watch_title": "Running Order - NCN Festival", "watch_url": "https://www.ncn-festival.de/programm/running-order/", "watch_open_url": "https://www.ncn-festival.de/programm/running-order/", "watch_uuid": "31236833-eee3-46d2-aced-ccae65da8032", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/31236833-eee3-46d2-aced-ccae65da8032"}}]
- Fri 18 Sep 2026 12:08:28 PM - SENDING - [{"title": "ChangeDetection.io Notification - https://changedetection.io/CHANGELOG.txt", "body": "https://changedetection.io/CHANGELOG.txt had a change.\n---\n<s>HEAD / 2026-09-17 22:35:29 +0200:</s>\n<b>HEAD / 2026-09-18 13:56:25 +0200:</b>\n<b> - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)</b>\n<b> - System - Ensure import+API update values are verified types (#4458)</b>\n<b> - UI - Horizontal lines and styling fixes for #4424</b>\n<b> - UI - Sidebar spacing/colour fixes</b>\n<b> - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes</b>\n<b> - API - Rebuild docs</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-18 12:08:27 UTC", "current_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-18 13:56:25 +0200:\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-17 22:35:29 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-18 13:56:25 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - System - Ensure import+API update values are verified types (#4458)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI - Horizontal lines and styling fixes for #4424@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI - Sidebar spacing/colour fixes@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - API - Rebuild docs@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/308c5c76-e290-4660-9296-62bcf1731735", "raw_diff": "@changed_PLACEMARKER_OPENHEAD / 2026-09-17 22:35:29 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-09-18 13:56:25 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - System - Ensure import+API update values are verified types (#4458)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI - Horizontal lines and styling fixes for #4424@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI - Sidebar spacing/colour fixes@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - API - Rebuild docs@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789733307.8900177, "prev_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-09-17 22:35:29 +0200:\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - \"Add watch\" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean \"extract right now\" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since \"first check\" was working really as \"since last check\", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: \"Make a new JSON object with the timestamp\")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - \"Time between check\" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - \"Summary\" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop \"Last Checked\" / \"Last Changed\" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] \"Usage\" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive \"Show advanced help and tips\" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use for discord (Actually Discord:// notifications should always use plaintext format anyway)\n - Test improvement - text extract tidyup (#4048)\n - Text filters - New simpler filter \"Extract lines containing text\" (#4046)\n - Handle inline favicons (#4047 #3891 )\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777\n - Add complete Turkish translation (#4044)\n - Czech l12n updates (#4043)\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)\n - Test - word-level diff - Re #4037 - adding test (#4042)\n - Fix/step failure notification crash (#4041)\n - Groups - Set custom colour for tag/group/label background (#4040)\n - fix: pass include_change_type_prefix to word-level diff (#4037)\n - Add Portuguese (Brasil) translation (#4033)\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)\n - diff_changed_from/diff_changed_from tokens - improve documentation\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)\n - UI - Minor text fix and add link to 'Restock Backup' from Imports\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)\n - Add Japanese translation (ja) (#4019)\n - UI - German translation: Visual Filter: \"Klare Auswahl\" is very misleading #4023\n\n - 0.54.8\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)\n - Ensure all unit tests are run (#4022)\n - Extendable theme pluggy implementation for main theme/template `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview \"GO\" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - \"Error 200 no content\" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for \"backups\" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to \"General\" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, \"batch mode\" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German \"From\" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global \"mute\" and \"pause\" buttons on main menu, move \"Backups\" to \"Settings\" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run \"clear all history\" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from \"General\" to \"Fetching\" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert \"Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to \"Markdown to HTML\" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty \"ignore text\" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends \"text/xml\" instead of the \"application/atom+xml\" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding \"Strip ignored lines\" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - \"Time between check\" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added \"unread\" view filter (#3393)\n - Enable \"last_viewed\" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving \"real-time updates offline\" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing \"Does NOT contain\" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of \"quick watch add form\" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under \"Visual Selector\" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how \"different\" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - \"Recheck all\" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including \"Extract text\", \"Text to ignore\", \"Trigger text\" and \"Text that should not be present\" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - \"Conditions\" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - \"Clone\" Should be \"Clone & Edit\" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set \"RSS Color HTML Format\" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding \"Search\" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new \"Make all child elements visible\" action\n - Browser Steps - Added new \"Remove elements\" action\n - UI - Browser Steps - \"Click X,Y\" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - \"Unique lines\" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - \"Browser Steps\" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `\"Exception: No parsable JSON found in this document\" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for \"linuxserver\" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - \"Send test notification\" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\" (#2844)\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n\n - 0.48.02\n - Notifications - \"Send test\" was not always following \"System default notification format\"\n - Notifications - Default notification format (for new installs) now \"HTML color\" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding \"HTML Color\" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - \"Send test notification\" in \"Restock\" mode was not working correclty when restock tokens \"{{restock.price}}\" were in the notification body (#2737)\n - #2727 Notifications - Fix \"send test notification\" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - \"Block change detection when text exists\" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - \"Diff\" button in overview list is now \"History\" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - \"Filters & Triggers\" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for \"out of stock\" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters \"Trim whitespace\" and \"Remove duplicate lines\"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add \"click element containing text if exists\" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with \"`[ ] Empty pages are a change`\" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding \"Download latest HTML snapshot\" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of \"original price\"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in \"CSS/JSONPath/JQ/XPath Filters\" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff \"ignore text\" highlight button (refactor, didnt work in \"preview\" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt \"wheels\" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in \"importlib\" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing \"goto site\" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added \"Use default recheck time\" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - \"Send Test Notification\" - In \"Group\" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - \"Send Test Notification\" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the \"quick watch add\" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - \"Send Test Notification\" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed \"Include filters\" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing \"'Response' object is not subscriptable\" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - \"In stock\" should be None/\"Not yet checked\" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - \"Add new watch\" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for \"Click X,Y\" step\n - API - Make sure the watch \"is viewed\" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the \"[Diff]\" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using \"scraping browsers\"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert \"Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for \"dynamic wachet\" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to \"bookworm\" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - \"Extract Text\" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - \"With errors\" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy \"limit to watches with errors\" button (#1886)\n - UI - Viewing text differences - Tweaks to \"Jump to next change\" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe \"current_snapshot\" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - \"recheck all\" button should ignore blank/empty \"tag\" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select \"No proxy\" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by \"date created\" or \"#\" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the \"unified patch format.\" (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - \"Test notification\" button in \"Group Tag\" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like \"localhost\" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as \"OK\" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update \"Filter not found\" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - \"Search List\" also works for 'Title' field\n - UI - New \"Search List\" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a \"click\" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for \"clear/reset history\"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to \"Add Email\" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding \"Wait for text\" and \"Wait for text in element\" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser \"Service Workers\" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action \"Recheck\"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable \"Browser Steps\" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing \"Unable to retrieve content because the page is navigating and changing the content.\" on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert \"don't process paused entries after queue\", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in \"paused\" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example \"//title/text()\" in RSS feeds (#778)\n - Bug fix - Filter \"Only trigger when new lines appear\" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying \"Visual Filter\" tool as \"Visual Selector Filter\"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text \"out of stock\" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res \"bug workaround\" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random \"jitter\" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include \"Extract text\" filter\n - Improve error message when filter not found in page result (#666)\n - \"Extract text\" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - \"Extract text\" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a \"[ ] default\" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix \"Add email\" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via \"source:https://website.com\" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make \"remove password\" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - \"Recheck\" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env \"FETCH_WORKERS\" (#413)\n - Adding Env var \"WEBDRIVER_DELAY_BEFORE_CONTENT_READY\" to wait n seconds before extracting the text from the browser\n - Language fix \"watches are rechecking.\" it actually puts them into an internal queue \"watches are QUEUED for rechecking\"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install \"tar@>=6.1.2\"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break \"Cookie\" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show \"new version available\" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - \"Sassify\" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show \"preview\" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "preview_url": "https://changes.sotzny.net/preview/308c5c76-e290-4660-9296-62bcf1731735", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "308c5c76-e290-4660-9296-62bcf1731735", "watch_mime_type": "text/plain", "watch_tag": "changedetection.io", "watch_title": "https://changedetection.io/CHANGELOG.txt", "watch_url": "https://changedetection.io/CHANGELOG.txt", "watch_open_url": "https://changedetection.io/CHANGELOG.txt", "watch_uuid": "308c5c76-e290-4660-9296-62bcf1731735", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/308c5c76-e290-4660-9296-62bcf1731735"}}]
- Fri 18 Sep 2026 08:06:24 AM - SENDING - [{"title": "ChangeDetection.io Notification - https://www.tnd.de/Site/1514", "body": "https://www.tnd.de/Site/1514 had a change.\n---\n<s> 2.39</s>\n<b> 2.37</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-18 08:06:00 UTC", "current_snapshot": " 2.37\n 1\n \u20ac\n Diesel", "diff": "@changed_PLACEMARKER_OPEN 2.39@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 2.37@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/f51fb228-02a0-4301-be31-75f38fa287e0", "raw_diff": "@changed_PLACEMARKER_OPEN 2.39@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 2.37@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789718783.3410273, "prev_snapshot": " 2.39\n 1\n \u20ac\n Diesel", "preview_url": "https://changes.sotzny.net/preview/f51fb228-02a0-4301-be31-75f38fa287e0", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "f51fb228-02a0-4301-be31-75f38fa287e0", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "", "watch_title": "https://www.tnd.de/Site/1514", "watch_url": "https://www.tnd.de/Site/1514", "watch_open_url": "https://www.tnd.de/Site/1514", "watch_uuid": "f51fb228-02a0-4301-be31-75f38fa287e0", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/f51fb228-02a0-4301-be31-75f38fa287e0"}}]
- Fri 18 Sep 2026 06:31:48 AM - SENDING - [{"title": "ChangeDetection.io Notification - https://www.tanteenso.de/content/tanteenso/standorte/grosslehna", "body": "https://www.tanteenso.de/content/tanteenso/standorte/grosslehna had a change.\n---\n<s> * 4,55 (15,3k) Hervorragend</s>\n<b> * 4,56 (15,3k) Hervorragend</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-18 06:30:50 UTC", "current_snapshot": "Visuelle Assistenzsoftware und Vorlesefunktion Eye-Able \u00f6ffnen. Mit der Tastatur erreichbar \u00fcber ALT + 1\n\n\n\n\n Suchen W\u00fcnschen Anmelden\n * Startseite\n * Teilhaberschaft\n * Tante Enso-Karte\n * Filialen\n * Neuigkeiten\n * Fanshop\n\n Dein Tante Enso in Gro\u00dflehna ist rund um die Uhr mit diesen Services f\u00fcr dich da: \u200b\n\n\n * 24/7 einkaufen mit kostenloser Tante Enso-Karte.\u200b\n * Dir fehlt dein Lieblingsartikel? \u200bDann w\u00fcnsch ihn dir! Sag uns deine Meinung, direkt hier oder im Tante Enso vor Ort.\n * Freude bereiten? \u200bVerschenke Einkaufsgutscheine f\u00fcr deinen Tante Enso\n * Immer neue Aktionen: Zum Beispiel neue Start-ups, regionale Produkte oder Gratisartikel!\n\n Tante Enso-Karte\n\n Hier kannst du deine pers\u00f6nliche Tante Enso-Karte beantragen.\n\n Mehr dazu\n Sag uns deine Meinung\n\n Was k\u00f6nnen wir noch besser machen?\n\n Mehr dazu\n Mitbesitzen\n\n Unsere Genossenschaft: Unterst\u00fctze Tante Ensos, foodpioniere & die Idee des besseren Einkaufens.\n\n Mehr dazu\n News von eurem Tante Enso\n\n Hier erfahrt ihr alle Neuigkeiten und Meilensteine eures Tante Ensos.\n\n Mehr dazu\n\n Personalbesetzte \u00d6ffnungszeiten\n\n\n Mo & Fr: 8:00 - 12:00 Uhr & 15:00 - 18:00 Uhr\n Di, Do & Sa: 8:00 - 12:00 Uhr\n Mi: Ruhetag\n\n\n *Zutritt mit der Tante Enso-Karte rund um die Uhr.\n\n Anschrift\n\n\n Tante Enso Gro\u00dflehna GmbH & Co. KG\n Bahnhofstra\u00dfe 52b\n 04420 Markranst\u00e4dt\n Navigation auf Google Maps\n\n Kontaktdaten\n\n\n E-Mail: grosslehna@enso-gruppe.de\n\n\n Telefon: 034205-418377\n\n Filialen\n\n * Standorte in PlanungBewerbung um einen Tante Enso\n * Unsere FilialenTante Enso-Karte\n * SponsoringKommissionskauf\n\n Online einkaufen\n\n * Lieferung & Versand\n * Zahlungsarten\n * Themen & Marken\n\n Unternehmen\n\n * Die IdeeUnsere WerteNachhaltigkeitsbericht\n * W\u00fcnsch dir wasTeilhaberschaftNeuigkeiten\n * VerantwortlicheKarriereJobs\n\n Hilfe & Kontakt\n\n * \u00d6ffnungszeitenFragen & Antworten\n * F\u00fcr regionale HerstellerPresse\n * Kontakt\n\n Rechtliches\n\n * AGBDatenschutz\n * ImpressumWiderrufsrechtKauf widerrufen\n * Cookie-EinstellungenBarrierefreiheitserkl\u00e4rung\n\n Mehr von uns findest du hier:\n\n * \n * \n * \n * \n * DE-\u00d6KO-006\n * \n * \n * 4,56 (15,3k) Hervorragend\n \u00a9 Tante Enso 2026", "diff": "@changed_PLACEMARKER_OPEN * 4,55 (15,3k) Hervorragend@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN * 4,56 (15,3k) Hervorragend@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/41aeaf84-2bb9-4d27-bea2-4e835bf23d3a", "raw_diff": "@changed_PLACEMARKER_OPEN * 4,55 (15,3k) Hervorragend@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN * 4,56 (15,3k) Hervorragend@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789713108.1175547, "prev_snapshot": "Visuelle Assistenzsoftware und Vorlesefunktion Eye-Able \u00f6ffnen. Mit der Tastatur erreichbar \u00fcber ALT + 1\n\n\n\n\n Suchen W\u00fcnschen Anmelden\n * Startseite\n * Teilhaberschaft\n * Tante Enso-Karte\n * Filialen\n * Neuigkeiten\n * Fanshop\n\n Dein Tante Enso in Gro\u00dflehna ist rund um die Uhr mit diesen Services f\u00fcr dich da: \u200b\n\n\n * 24/7 einkaufen mit kostenloser Tante Enso-Karte.\u200b\n * Dir fehlt dein Lieblingsartikel? \u200bDann w\u00fcnsch ihn dir! Sag uns deine Meinung, direkt hier oder im Tante Enso vor Ort.\n * Freude bereiten? \u200bVerschenke Einkaufsgutscheine f\u00fcr deinen Tante Enso\n * Immer neue Aktionen: Zum Beispiel neue Start-ups, regionale Produkte oder Gratisartikel!\n\n Tante Enso-Karte\n\n Hier kannst du deine pers\u00f6nliche Tante Enso-Karte beantragen.\n\n Mehr dazu\n Sag uns deine Meinung\n\n Was k\u00f6nnen wir noch besser machen?\n\n Mehr dazu\n Mitbesitzen\n\n Unsere Genossenschaft: Unterst\u00fctze Tante Ensos, foodpioniere & die Idee des besseren Einkaufens.\n\n Mehr dazu\n News von eurem Tante Enso\n\n Hier erfahrt ihr alle Neuigkeiten und Meilensteine eures Tante Ensos.\n\n Mehr dazu\n\n Personalbesetzte \u00d6ffnungszeiten\n\n\n Mo & Fr: 8:00 - 12:00 Uhr & 15:00 - 18:00 Uhr\n Di, Do & Sa: 8:00 - 12:00 Uhr\n Mi: Ruhetag\n\n\n *Zutritt mit der Tante Enso-Karte rund um die Uhr.\n\n Anschrift\n\n\n Tante Enso Gro\u00dflehna GmbH & Co. KG\n Bahnhofstra\u00dfe 52b\n 04420 Markranst\u00e4dt\n Navigation auf Google Maps\n\n Kontaktdaten\n\n\n E-Mail: grosslehna@enso-gruppe.de\n\n\n Telefon: 034205-418377\n\n Filialen\n\n * Standorte in PlanungBewerbung um einen Tante Enso\n * Unsere FilialenTante Enso-Karte\n * SponsoringKommissionskauf\n\n Online einkaufen\n\n * Lieferung & Versand\n * Zahlungsarten\n * Themen & Marken\n\n Unternehmen\n\n * Die IdeeUnsere WerteNachhaltigkeitsbericht\n * W\u00fcnsch dir wasTeilhaberschaftNeuigkeiten\n * VerantwortlicheKarriereJobs\n\n Hilfe & Kontakt\n\n * \u00d6ffnungszeitenFragen & Antworten\n * F\u00fcr regionale HerstellerPresse\n * Kontakt\n\n Rechtliches\n\n * AGBDatenschutz\n * ImpressumWiderrufsrechtKauf widerrufen\n * Cookie-EinstellungenBarrierefreiheitserkl\u00e4rung\n\n Mehr von uns findest du hier:\n\n * \n * \n * \n * \n * DE-\u00d6KO-006\n * \n * \n * 4,55 (15,3k) Hervorragend\n \u00a9 Tante Enso 2026", "preview_url": "https://changes.sotzny.net/preview/41aeaf84-2bb9-4d27-bea2-4e835bf23d3a", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "41aeaf84-2bb9-4d27-bea2-4e835bf23d3a", "watch_mime_type": "text/html;charset=utf-8", "watch_tag": "", "watch_title": "Tante Enso in Gro\u00dflehna", "watch_url": "https://www.tanteenso.de/content/tanteenso/standorte/grosslehna", "watch_open_url": "https://www.tanteenso.de/content/tanteenso/standorte/grosslehna", "watch_uuid": "41aeaf84-2bb9-4d27-bea2-4e835bf23d3a", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/41aeaf84-2bb9-4d27-bea2-4e835bf23d3a"}}]
- Fri 18 Sep 2026 06:23:28 AM - SENDING - [{"title": "ChangeDetection.io Notification - https://www.tanteenso.de/content/tanteenso/standorte/grosslehna/neuigkeiten", "body": "https://www.tanteenso.de/content/tanteenso/standorte/grosslehna/neuigkeiten had a change.\n---\n<s> * 4,55 (15,3k) Hervorragend</s>\n<b> * 4,56 (15,3k) Hervorragend</b>\n---", "url": "tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989?avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=text", "original_context": {"base_url": "https://changes.sotzny.net/", "change_datetime": "2026-09-18 06:22:17 UTC", "current_snapshot": "Visuelle Assistenzsoftware und Vorlesefunktion Eye-Able \u00f6ffnen. Mit der Tastatur erreichbar \u00fcber ALT + 1\n\n\n\n\n Suchen W\u00fcnschen Anmelden\n * Startseite\n * Teilhaberschaft\n * Tante Enso-Karte\n * Filialen\n * Neuigkeiten\n * Fanshop\n\n Hier erfahrt ihr das Neueste \u00fcber euren Tante Enso in Gro\u00dflehna\n\n Tante Enso er\u00f6ffnet in\n Gro\u00dflehna!\n\n Seit dem 25. Juli 2024 hei\u00dft es auch in Gro\u00dflehna: Wir haben einen Tante Enso!\n\n Mehr dazu\n Gro\u00dflehna Update 4\n (01.07.2024)\n\n Malt euch einen Enso-Kreis in den Kalender: Euer Er\u00f6ffnungstermin steht offiziell!\n\n Mehr dazu\n Grosslehna Update 3\n (07.06.2024)\n\n Ihr habt zahlreich euren Tante Enso mitgestaltet \u2013 hier ein paar Ergebnisse eurer Co-Creation.\n\n Mehr dazu\n Gro\u00dflehna Update 2\n (24.05.2024)\n\n Der Countdown f\u00fcr die Co-Creation l\u00e4uft. F\u00fcllt den Fragebogen aus und gestaltet euren Tante Enso mit!\n\n Mehr dazu\n Gro\u00dflehna Update 1\n (20.03.2024)\n\n Juhuu, ihr habt euer Kampagnenziel erreicht! Wie es jetzt weitergeht, erfahrt ihr in eurem 1. Update!\n\n Mehr dazu\n Das sagt ihr \u00fcber euren Tante Enso\n\n Wir haben euch gefragt, warum ihr euch einen Tante Enso w\u00fcnscht. Das sind eure Antworten!\n\n Mehr dazu\n Absichtserkl\u00e4rung zur Er\u00f6ffnung eines Tante Ensos\n\n Wir haben gemeinsam eine Absichtserkl\u00e4rung unterschrieben\n\n Mehr dazu\n\n Hier erfahrt ihr alles rund um Tante Enso\n\n Tante Enso er\u00f6ffnet\n in Brombachtal\n\n Am 10.09.2026 er\u00f6ffnet die 4. Tante Enso-Filiale in Hessen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in St\u00f6ckse\n\n Am 03.09.2026 er\u00f6ffnet die 40. Tante Enso-Filiale in Niedersachsen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet wieder\n in Ehra-Lessien\n\n Am 20.08.2026 feiern wir die erste Wiederer\u00f6ffnung.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Sandstedt\n\n Am 13.08.2026 er\u00f6ffnet die 39. Tante Enso in Niedersachsen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in L\u00fcnten\n\n Am 30.07.2026 er\u00f6ffnet die 9. Tante Enso in Nordrhein-Westfalen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Premich\n\n Am 28.07.2026 er\u00f6ffnet die 8. Tante Enso-Filiale in Bayern.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in H\u00f6fer\n\n Am 09.07.2026 er\u00f6ffnet die 91. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Elmstein\n\n Am 02.07.2026 er\u00f6ffnet die 90. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Oberbieber\n\n Am 23.06.2026 er\u00f6ffnet die 89. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Langen\n\n Am 28.05.2026 er\u00f6ffnet die 88. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Winningen\n\n Am 01.04.2026 er\u00f6ffnet die 87. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Nendorf\n\n Am 19.02.2026 er\u00f6ffnet die 86. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Poppenlauer\n\n Am 10.02.2026 wurde die 85. Filiale in Poppenlauer er\u00f6ffnet.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Freyenstein\n\n Am 22.01.2026 er\u00f6ffnet die 84. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Hochmoor\n\n Am 15.01.2026 er\u00f6ffnet die 83. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Hohenroth\n\n Am 18.12.2025 er\u00f6ffnet die 82. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Mastershausen\n\n Am 04.12.2025 er\u00f6ffnet die 81. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n auf der Atzel\n\n Am 27.11.2025 er\u00f6ffnet die 80. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Weihnachten bei Tante Enso\n\n Unsere Weihnachtswochen\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Husum\n\n Am 06.11.2025 um 12 Uhr \u00f6ffnet die 79. Tante Enso-Filiale bundesweit offiziell die T\u00fcr.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Loxten\n\n Am 23.10.2025 um 12 Uhr \u00f6ffnet die 78. Tante Enso-Filiale bundesweit offiziell die T\u00fcr.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Warmsen\n\n Am 09.10.2025 er\u00f6ffnet in Warmsen der 34. Tante Enso in Niedersachsen und die 77. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Heltersberg\n\n Am 18.09.2025 er\u00f6ffnet in Heltersberg der 4. Tante Enso in Rheinland-Pfalz und die 76. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Stemmen\n\n Am 11.09.2025 er\u00f6ffnet in Stemmen der 6. Tante Enso in Nordrhein-Westfalen und die 75. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Seefeld\n\n Am 31.07.2025 er\u00f6ffnet in Seefeld der 33. Tante Enso in Niedersachsen und die 74. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Kastorf\n\n Am 17.07.2025 er\u00f6ffnet in Kastorf die 73. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Mellenbach-Glasbach\n\n Am 03.07.2025 er\u00f6ffnet in Mellenbach-Glasbach die 72. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Balhorn\n\n Am 26.06.2025 er\u00f6ffnet in Balhorn der 3. Tante Enso in Hessen und die 72. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Sukow\n\n Am 19.06.2025 er\u00f6ffnet der 2. Tante Enso in Mecklenburg-Vorpommern und die 71. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Seth\n\n Am 12. Juni 2025 er\u00f6ffnet in Seth die 70. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Toppenstedt\n\n Am 22.05.2025 er\u00f6ffnet in Toppenstedt die 69. Tante Enso-Filiale.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Dabel\n\n Am 08.05.2025 um 12 Uhr \u00f6ffnet offiziell der erste Tante Enso in Mecklenburg-Vorpommern.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Mansbach\n\n Am 16.04.2025 um 12 Uhr \u00f6ffnet offiziell der zweite Tante Enso in Hessen seine T\u00fcr.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Rastdorf\n\n Am 11.04.2025 um 12 Uhr er\u00f6ffnet offiziell der 33. Tante Enso in Niedersachsen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Oppenwehe\n\n Am 03.04.2025 um 12 Uhr \u00f6ffnet offiziell der f\u00fcnfte Tante Enso in Nordrhein-Westfalen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Langenstein\n\n Am 27.03.2025 um 12 Uhr \u00f6ffnet offiziell der f\u00fcnfte Tante Enso in Sachsen-Anhalt.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Bernau\n\n Am 26.03.2025 um 12 Uhr er\u00f6ffnet offiziell der zweite Tante Enso in Baden-W\u00fcrttemberg und die 66. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Molzen\n\n Am 20.03.2025 er\u00f6ffnet offiziell der 32. Tante Enso in Niedersachsen und die 65. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Roitzsch\n\n Am 27.02.2025 \u00f6ffnet offiziell der 4. Tante Enso in Sachsen-Anhalt und die 64. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Eimke\n\n Am 30. Januar 2025 er\u00f6ffnet in Eimke die 31. Filiale in Niedersachsen und der 63. Tante Enso bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Hahnenklee\n\n Am 19.12.2024 er\u00f6ffnet in Hahnenklee der 30. Tante Enso in Niedersachsen und die 62. Filiale bundesweit.\n\n Mehr dazu\n Er\u00f6ffnung des Tante Enso Wieren\n\n Am 11. Dezember 2024 wurde es feierlich vor dem Neubau: Nach drei Jahren konnte das Kapitel Nahversorgung im Ort abgeschlossen werden.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Horsten\n\n Am 05.12.2024 er\u00f6ffnet in Horsten der 28. Tante Enso in Niedersachsen und die 60. Filiale bundesweit.\n\n Mehr dazu\n Er\u00f6ffnung in Amelunxen\n (21.11.2024)\n\n 1, 2, 3, Konfetti! Willkommen im Tante Enso!\n\n Mehr dazu\n Er\u00f6ffnung in Kohren-Sahlis\n\n Am 7.11.2024 er\u00f6ffnet in Kohren-Sahlis der 3. Tante Enso in Sachsen und die 58. Filiale bundesweit.\n\n Mehr dazu\n Die Tante Enso-Karten-PIN ist da\n\n Wer auf Nummer sicher gehen m\u00f6chte, kann sich ab jetzt eine PIN einrichten.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Schwabstedt\n\n Am 30.10. 2024 um 12 Uhr er\u00f6ffnet in Schwabstedt die 8. Filiale in Schleswig-Holstein und die 57. bundesweit.\n\n Mehr dazu\n H\u00f6rster Er\u00f6ffnung des Tante Enso\n\n Am 10.10.2024 \u00f6ffnete der dritte Tante Enso in Nordrhein-Westfalen seine T\u00fcren.\n\n Mehr dazu\n Er\u00f6ffnung in Gro\u00df Vollstedt (25.09.2024)\n\n Endlich regnete es Konfetti!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Frauenau\n\n Am 12. September 2024 bekommt Frauenau wieder eine fu\u00dfl\u00e4ufige Nahversorgung. Es ist die 5. Tante Enso-Filiale in Bayern.\n\n Mehr dazu\n Am 7.09.2024 wurde bei sch\u00f6nstem Sonnenschein ausgelassen gefeiert, getanzt & gegessen.\n\n Musikalisch und bewegt: Tante Enso G\u00f6rzig feiert 1. Jubil\u00e4um\n\n Mehr dazu\n Er\u00f6ffnung in Eppenbrunn\n (29.08.2024)\n\n Hei\u00df und bunt war's: Hier k\u00f6nnt ihr die Er\u00f6ffnung noch einmal nacherleben.\n\n Mehr dazu\n Konfetti f\u00fcr Bilshausen\n\n Seit dem 22. August 2024 ist Tante Enso in Bilshausen er\u00f6ffnet.\n\n Mehr dazu\n Volles Pfund Tante Enso: Die 50. Filiale...\n\n ... und ein kleiner Blick zur\u00fcck bei diesem Meilenstein.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Zernien\n\n Am 8. August 2024 er\u00f6ffnet in Zernien der 26. Tante Enso in Niedersachsen und die 50. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Gro\u00dflehna\n\n Am 25. Juli 2024 bekommt Gro\u00dflehna wieder eine fu\u00dfl\u00e4ufige Nahversorgung. Es ist der 2. Tante Enso in Sachsen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Neuenkirchen\n\n Unter viel Konfetti, Geschenken und guter Laune er\u00f6ffnet in Neuenkirchen die 47. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Ummern feiert die 46. Er\u00f6ffnung\n\n Tante Enso hat einen ehemaligen Kneipensaal als Bleibe mit Charakter erhalten.\n\n Mehr dazu\n Feste feiern in Holtsee: Er\u00f6ffnung am 21.06.2024\n\n Endlich wieder eine Nahversorgung! Viele Holtseer kamen, um einen ersten Blick in ihren frisch eingerichteten Tante Enso zu werfen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Abtsdorf\n\n Am 13. Juni 2024 malt das Konfetti den Himmel bunt \u2013 und Abstdorf hat einen Tante Enso!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Barver!\n\n Am 06. Juni 2024 fiel der langersehnte Konfettiregen.\n\n Mehr dazu\n Auch Wassenach kann Tante Enso\n\n Am 5. Juni 2024 \u00f6ffnet in Wassenach der Tante Enso zum ersten Mal offiziell die T\u00fcr.\n\n Mehr dazu\n Auf geht\u2019s, Spieka!\n\n Am 30.05.2024 konntet ihr die Er\u00f6ffnung eurer Filiale feiern.\n\n Mehr dazu\n Tante Enso H\u00fcttenbusch ist er\u00f6ffnet!\n\n Am 16.05.2024 \u00f6ffneten sich im Ort (wieder) die T\u00fcren eines Nahversorgers.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n K\u00fcnsebeck\n\n Blauer Himmel, viel Sonnenschein und noch mehr gute Laune: Am 30. April er\u00f6ffnet Tante Enso in K\u00fcnsebeck.\n\n Mehr dazu\n Tante Enso in Mohrkirch ist er\u00f6ffnet!\n\n Am 25. April 2024 gab\u2019s bei euch den ersehnten Konfettimoment!\n\n Mehr dazu\n Tante Enso Glasau feiert Einj\u00e4hriges!\n\n Alles Gute zum Geburtstag, MarktTreff & Tante Enso!\n Am 23.03.2024 wird ordentlich gefeiert!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Elfershausen\n\n Bei bedecktem Himmel und bester Laune er\u00f6ffnet am 21. M\u00e4rz 2024 der Tante Enso in Elfershausen.\n\n Mehr dazu\n Ostern bei Tante Enso\n\n Wir haben \u00dcberraschungen, Rezepte und Geschenkideen f\u00fcr dich!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Bollendorf\n\n Am 29.02.2024 um 12 Uhr ist es endlich soweit: Bei strahlendem Sonnenschein, Sekt und viel guter Laune \u00f6ffnet der Tante Enso in Bollendorf zum ersten Mal seine T\u00fcr.\n\n Mehr dazu\n Happy Birthday,\n Ehra-Lessien!\n\n Wir feiern am 9. M\u00e4rz 2024\n euren ersten Geburtstag!\n\n Mehr dazu\n Happy Birthday Drangstedt!\n\n Euer Tante Enso feiert\n am 23.02.2024\n den ersten Geburtstag!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Bruckberg!\n\n Die 35. Filiale, davon die 3 in Bayern (sorry, Franken) \u2013 das Wetter kriegte noch die Kurve und die Menschen vor Ort gingen zahlreich vor die T\u00fcr. (01.02.2024)\n\n Mehr dazu\n Eure W\u00fcnsche im Jahr 2023\n\n So viele konnten wir in die Regale bringen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Nettlingen\n\n Am 18. Januar 2024 ist es soweit: Auch Nettlingen kann Tante Enso!\n\n Mehr dazu\n Profitiere von deinen Einkaufsvorteilen.\n\n In deinem Kundenkonto hast du alles auf einen Blick.\n\n Mehr dazu\n Tante Enso Falkenau ist er\u00f6ffnet!\n\n Am 11. Januar 2024 war es so weit, das Konfetti rieselte in klirrender K\u00e4lte herunter.\n\n Mehr dazu\n Jahresr\u00fcckblick 2023\n\n Wir haben das Jahr einmal kurz filmisch zusammengefasst und freuen uns auf 2024.\n\n Mehr dazu\n Er\u00f6ffnung: Tante Enso Siedenburg!\n\n Der letzte in 2023, mit Konfetti in B\u00f6en\n und fr\u00f6hlich-festlichem Rahmen machte am 21.12. die T\u00fcren auf.\n\n Mehr dazu\n Tante Enso Neu Darchau ist er\u00f6ffnet!\n\n Am 19.12.2023 war es so weit: Unsere 31. und in diesem Jahr vorletzte Filiale ist an den Start gegangen,\n trotz Regen war es ein buntes Fest!\n\n Mehr dazu\n Der erste Geburtstag von Tante Enso Sievern!\n\n Unfassbar, und zack, ist ein Jahr vorbei! Viel wurde schon gew\u00fcnscht,\n und weitere W\u00fcnsche werden in 2024 umgesetzt!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in M\u00fcnnerstadt!\n\n Am 14.12.2023 um 12 Uhr ist es soweit: Auch M\u00fcnnerstadt kann Tante Enso!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Ihlienworth!\n\n Am 12.12.2023 um Punkt 12 Uhr ist es soweit: Auch Ihlienworth bekommt wieder eine fu\u00dfl\u00e4ufige Nahversorgung!\n\n Mehr dazu\n Tante Enso Emtinghausen ist er\u00f6ffnet!\n\n Am 7. Dezember 2023 war es endlich so weit, unter gro\u00dfem Dorfinteresse\n wurde unsere Bremen-n\u00e4chste Filiale er\u00f6ffnet.\n\n Mehr dazu\n Der Moisburger Tante Enso ist auch er\u00f6ffnet!\n (30.11.2023)\n\n Pr\u00e4chtige Stimmung, Dorffestcharakter und dazu\n noch einkaufen k\u00f6nnen \u2013 Moisburg ist happy.\n\n Mehr dazu\n Tante Enso Aschen ist er\u00f6ffnet!\n\n Am 28. November 2023 war es so weit, das Konfetti\n rieselte mit den ersten Schneeflocken herunter.\n\n Mehr dazu\n Er\u00f6ffnung des Tante Enso in Schweskau!\n\n Bei nieseligem Novemberwetter haben die Besucher\n des bunten Tante Enso fr\u00f6hliche Akzente gesetzt.\n\n Mehr dazu\n Tante Enso Axstedt ist er\u00f6ffnet!\n\n Sch\u00f6n & herbstlich, freudig und voller guter Laune:\n So war eure Er\u00f6ffnung!\n\n Mehr dazu\n Zellas Tanten von der Tante\n\n Zum 1. Jubil\u00e4um zeigt Zella ein paar Impressionen.\n\n Mehr dazu\n Schnega feiert das dritte Jubil\u00e4um\n\n Herzlichen Gl\u00fcckwunsch & feiert am 27.10.23 mit!\n\n Mehr dazu\n Gl\u00fcckwunsch, Tante Enso V\u00f6gelsen!\n\n Am 6.10.2022 wurde die gr\u00f6\u00dfte der Filialen er\u00f6ffnet.\n\n Mehr dazu\n 4!!! Happy birthday, Tante Enso Blender!\n\n Kaum zu glauben: Unser erster Tante Enso auf dem Land ist vier Jahre alt.\n 22 weitere L\u00e4den sp\u00e4ter, besuchen wir euch immer noch gern.\n\n Mehr dazu\n Tante Enso in Sellstedt hat 1. Geburtstag!\n\n Wir gratulieren & haben mal kurz in euren Laden geschaut.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in G\u00f6rzig\n\n Am 7. September 2023 bekommt G\u00f6rzig wieder eine fu\u00dfl\u00e4ufige Nahversorgung. Die Er\u00f6ffnung wird sogar live im Fernsehen \u00fcbertragen.\n\n Mehr dazu\n Happy birthday, Tante Enso Hemmingstedt!\n\n Das erste Jahr ist schon vorbei \u2013\n was wir im n\u00e4chsten noch besser machen wollen.\n\n Mehr dazu\n Barenburgs Tante Enso er\u00f6ffnet am 31. August 2023\n\n Dynamisch war das Wort des Tages \u2013 lest selbst, warum!\n\n Mehr dazu\n Tante Enso in Breddorf ist er\u00f6ffnet!\n\n Gelb wie der Sonnenschein strahlt der neue Tante Enso seit dem 24.08.2023\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in Neuenheerse\n\n Am 17.08.2023 er\u00f6ffnet offiziell Tante Enso in Neuenheerse. Es ist die erste Filiale in Nordrhein-Westfalen.\n\n Mehr dazu\n Bei euch piept's wohl!\n\n Zumindest (wieder) an der Selbst-Checkout-Kasse.\n\n Mehr dazu\n G\u00fclzow blickt auf ein Jahr Tante Enso zur\u00fcck\n\n In Bild & Ton, zum Jubil\u00e4um ein kleiner Film.\n\n Mehr dazu\n Ein Jahr Tante Enso Brekendorf!\n\n Ein kleiner R\u00fcckblick und Impressionen von unserer bisher n\u00f6rdlichsten Filiale.\n\n Mehr dazu\n Filialnews aus Sellstedt\n (Stand 22.05.2023)\n\n Im Tante Enso in Sellstedt wird die Kundschaft direkt lachend begr\u00fc\u00dft. Die Stimmung ist super - und einkaufen gehen die Menschen inzwischen sehr gerne sonntags.\n\n Mehr dazu\n Bald 4 Jahre: Tante Enso in Blender\n\n Unser erster, unser Meilenstein, unser \u00e4ltester: Stimmen aus der Dorfidylle.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in W\u00f6rlitz\n\n Der 20. Tante Enso Markt, der erste in Sachsen-Anhalt: So sch\u00f6n war es am 20. April.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Glasau\n\n Ein richtig tolles Geb\u00e4ude in einem tollen Ort: So war die Er\u00f6ffnung am 23. M\u00e4rz 2023.\n\n Mehr dazu\n Filialnews aus Hemmingstedt\n\n Seit 7 Monaten steht das Team im Tante Enso und freut sich \u00fcber besondere Kunden.\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in Ehra-Lessien\n\n Am 09.03.2023 er\u00f6ffnet in Ehra-Lessien, Niedersachsen, der 18. Tante Enso bundesweit. Der \u00f6rtliche Shanty-Chor untermalt das freudige Ereignis musikalisch.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Drangstedt\n\n Am 23.02.2023 malen die Konfetti-Kanonen den grauen Himmel bunt. Um Punkt 12 Uhr bekommt Drangstedt im Geestland offiziell einen eigenen Tante Enso Mini-Supermarkt.\n\n Mehr dazu\n Tante Enso: Er\u00f6ffnung in Sievern\n\n Am 15.12.2022 wurde das rote Band bei wei\u00dfen Schneeflocken durchtrennt.\n\n Mehr dazu\n Ein Bild und seine Geschichte\n\n Filialnews mal anders.\n Der tierische Kundenparkplatz.\n\n Mehr dazu\n Einzigartig! Der W\u00fcnsch-dir-was Bereich bei myEnso und Tante Enso\n\n Die Ohren und den Stift stets gespitzt, um Kundenw\u00fcnsche zu erf\u00fcllen \u2013 das macht Marcus von Horn bei myEnso. Ein Interview mit dem Projektmanager W\u00fcnsch-dir-was.\n\n Mehr dazu\n Der Nikolaus kommt in die l\u00e4ndlichen Tante Enso Filialen!\n\n Schnappt eure Kinder und Enkel und seid mit Stiefel dabei.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Zella\n\n So sch\u00f6n war's am 4.11. in Zella.\n\n Mehr dazu\n Gl\u00fcckwunsch Schnega zu zwei Jahren Tante Enso!\n\n Am 23. Oktober 2020 hat Tante Enso in Schnega zum ersten Mal seine T\u00fcren ge\u00f6ffnet. Es ist der 3. Tante Enso, den myEnso er\u00f6ffnet. Ein paar Impressionen von damals und heute.\n\n Mehr dazu\n \u00dcbersch\u00fcssige Lebensmittel retten\n\n Auch Tante Enso kooperiert mit Too good to go\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in V\u00f6gelsen\n\n Am 06.10.2022 knallen um 12.00 Uhr die Konfetti-Kanonen. Denn der Tante Enso Mini-Supermarkt in V\u00f6gelsen \u00f6ffnet zum ersten Mal seine T\u00fcr.\n\n Mehr dazu\n Wenn es in der Lieferkette hakt...\n\n Warum herrscht bei meinem Tante Enso in einigen Regalen g\u00e4hnende Leere? Wir haben H\u00e9ctor Losada interviewt. Er ist bei uns verantwortlich f\u00fcr Lagerlogistik & Beschaffung.\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in Sellstedt\n\n Am 22.09.2022 hat Sellstedt seinen neuen Tante Enso Mini-Supermarkt er\u00f6ffnet.\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in Hemmingstedt\n\n Am 01.09.2022 er\u00f6ffnete Tante Enso Hemmingstedt.\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in Lilienthal\n\n Am 24.08.2022 er\u00f6ffnete Lilis Tante Enso der Lilienthaler Diakonie.\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in G\u00fclzow\n\n Am 28.07.2022 hat euer Tante Enso Mini-Supermarkt in G\u00fclzow er\u00f6ffnet! Mit Blasmusik, Bratwurst und viel Bravo.\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in Brekendorf\n\n Am 1. Juli 2022 hat eurer Tante Enso Mini-Supermarkt in Brekendorf er\u00f6ffnet. Mit viel Tantam, Konfetti und hohem Besuch!\n\n Mehr dazu\n Er\u00f6ffnungsfeier: Schwiegershausen begr\u00fc\u00dft Tante Enso!\n\n Ein Einblick in die Er\u00f6ffnung des Tante Ensos in Schwiegershausen.\n\n Mehr dazu\n Er\u00f6ffnungsfeier in Wollbach: Bayern begr\u00fc\u00dft Tante Enso!\n\n Mit viel Engagement zum gemeinsamen Projekt\n\n Mehr dazu\n Die besten Bewerbungsvideos um einen Tante Enso\n\n Wir sind begeistert welche kreativen Videos uns bereits erreicht haben.\n\n Mehr dazu\n Wohlf\u00fchlen auf dem Land - geht das eigentlich noch?\n\n Unser Standpunkt zur ARD-Themenwoche: Stadt.Land.Wandel\n\n Mehr dazu\n Tante Enso \u2013 Was ist passiert in 2021?\n\n Das Gesch\u00e4ftsmodell Tante Enso ist sozusagen \u2013 im positiven \u2013 explodiert!\n\n Mehr dazu\n Zur\u00fcck\n\n Filialen\n\n * Standorte in PlanungBewerbung um einen Tante Enso\n * Unsere FilialenTante Enso-Karte\n * SponsoringKommissionskauf\n\n Online einkaufen\n\n * Lieferung & Versand\n * Zahlungsarten\n * Themen & Marken\n\n Unternehmen\n\n * Die IdeeUnsere WerteNachhaltigkeitsbericht\n * W\u00fcnsch dir wasTeilhaberschaftNeuigkeiten\n * VerantwortlicheKarriereJobs\n\n Hilfe & Kontakt\n\n * \u00d6ffnungszeitenFragen & Antworten\n * F\u00fcr regionale HerstellerPresse\n * Kontakt\n\n Rechtliches\n\n * AGBDatenschutz\n * ImpressumWiderrufsrechtKauf widerrufen\n * Cookie-EinstellungenBarrierefreiheitserkl\u00e4rung\n\n Mehr von uns findest du hier:\n\n * \n * \n * \n * \n * DE-\u00d6KO-006\n * \n * \n * 4,56 (15,3k) Hervorragend\n \u00a9 Tante Enso 2026", "diff": "@changed_PLACEMARKER_OPEN * 4,55 (15,3k) Hervorragend@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN * 4,56 (15,3k) Hervorragend@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changes.sotzny.net/diff/c8bd8ee7-ee7b-4d9c-8461-d838cc9e155e", "raw_diff": "@changed_PLACEMARKER_OPEN * 4,55 (15,3k) Hervorragend@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN * 4,56 (15,3k) Hervorragend@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1789712608.7063081, "prev_snapshot": "Visuelle Assistenzsoftware und Vorlesefunktion Eye-Able \u00f6ffnen. Mit der Tastatur erreichbar \u00fcber ALT + 1\n\n\n\n\n Suchen W\u00fcnschen Anmelden\n * Startseite\n * Teilhaberschaft\n * Tante Enso-Karte\n * Filialen\n * Neuigkeiten\n * Fanshop\n\n Hier erfahrt ihr das Neueste \u00fcber euren Tante Enso in Gro\u00dflehna\n\n Tante Enso er\u00f6ffnet in\n Gro\u00dflehna!\n\n Seit dem 25. Juli 2024 hei\u00dft es auch in Gro\u00dflehna: Wir haben einen Tante Enso!\n\n Mehr dazu\n Gro\u00dflehna Update 4\n (01.07.2024)\n\n Malt euch einen Enso-Kreis in den Kalender: Euer Er\u00f6ffnungstermin steht offiziell!\n\n Mehr dazu\n Grosslehna Update 3\n (07.06.2024)\n\n Ihr habt zahlreich euren Tante Enso mitgestaltet \u2013 hier ein paar Ergebnisse eurer Co-Creation.\n\n Mehr dazu\n Gro\u00dflehna Update 2\n (24.05.2024)\n\n Der Countdown f\u00fcr die Co-Creation l\u00e4uft. F\u00fcllt den Fragebogen aus und gestaltet euren Tante Enso mit!\n\n Mehr dazu\n Gro\u00dflehna Update 1\n (20.03.2024)\n\n Juhuu, ihr habt euer Kampagnenziel erreicht! Wie es jetzt weitergeht, erfahrt ihr in eurem 1. Update!\n\n Mehr dazu\n Das sagt ihr \u00fcber euren Tante Enso\n\n Wir haben euch gefragt, warum ihr euch einen Tante Enso w\u00fcnscht. Das sind eure Antworten!\n\n Mehr dazu\n Absichtserkl\u00e4rung zur Er\u00f6ffnung eines Tante Ensos\n\n Wir haben gemeinsam eine Absichtserkl\u00e4rung unterschrieben\n\n Mehr dazu\n\n Hier erfahrt ihr alles rund um Tante Enso\n\n Tante Enso er\u00f6ffnet\n in Brombachtal\n\n Am 10.09.2026 er\u00f6ffnet die 4. Tante Enso-Filiale in Hessen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in St\u00f6ckse\n\n Am 03.09.2026 er\u00f6ffnet die 40. Tante Enso-Filiale in Niedersachsen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet wieder\n in Ehra-Lessien\n\n Am 20.08.2026 feiern wir die erste Wiederer\u00f6ffnung.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Sandstedt\n\n Am 13.08.2026 er\u00f6ffnet die 39. Tante Enso in Niedersachsen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in L\u00fcnten\n\n Am 30.07.2026 er\u00f6ffnet die 9. Tante Enso in Nordrhein-Westfalen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Premich\n\n Am 28.07.2026 er\u00f6ffnet die 8. Tante Enso-Filiale in Bayern.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in H\u00f6fer\n\n Am 09.07.2026 er\u00f6ffnet die 91. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Elmstein\n\n Am 02.07.2026 er\u00f6ffnet die 90. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Oberbieber\n\n Am 23.06.2026 er\u00f6ffnet die 89. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Langen\n\n Am 28.05.2026 er\u00f6ffnet die 88. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Winningen\n\n Am 01.04.2026 er\u00f6ffnet die 87. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Nendorf\n\n Am 19.02.2026 er\u00f6ffnet die 86. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Poppenlauer\n\n Am 10.02.2026 wurde die 85. Filiale in Poppenlauer er\u00f6ffnet.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Freyenstein\n\n Am 22.01.2026 er\u00f6ffnet die 84. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Hochmoor\n\n Am 15.01.2026 er\u00f6ffnet die 83. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Hohenroth\n\n Am 18.12.2025 er\u00f6ffnet die 82. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n in Mastershausen\n\n Am 04.12.2025 er\u00f6ffnet die 81. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet\n auf der Atzel\n\n Am 27.11.2025 er\u00f6ffnet die 80. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Weihnachten bei Tante Enso\n\n Unsere Weihnachtswochen\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Husum\n\n Am 06.11.2025 um 12 Uhr \u00f6ffnet die 79. Tante Enso-Filiale bundesweit offiziell die T\u00fcr.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Loxten\n\n Am 23.10.2025 um 12 Uhr \u00f6ffnet die 78. Tante Enso-Filiale bundesweit offiziell die T\u00fcr.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Warmsen\n\n Am 09.10.2025 er\u00f6ffnet in Warmsen der 34. Tante Enso in Niedersachsen und die 77. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Heltersberg\n\n Am 18.09.2025 er\u00f6ffnet in Heltersberg der 4. Tante Enso in Rheinland-Pfalz und die 76. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Stemmen\n\n Am 11.09.2025 er\u00f6ffnet in Stemmen der 6. Tante Enso in Nordrhein-Westfalen und die 75. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Seefeld\n\n Am 31.07.2025 er\u00f6ffnet in Seefeld der 33. Tante Enso in Niedersachsen und die 74. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Kastorf\n\n Am 17.07.2025 er\u00f6ffnet in Kastorf die 73. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Mellenbach-Glasbach\n\n Am 03.07.2025 er\u00f6ffnet in Mellenbach-Glasbach die 72. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Balhorn\n\n Am 26.06.2025 er\u00f6ffnet in Balhorn der 3. Tante Enso in Hessen und die 72. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Sukow\n\n Am 19.06.2025 er\u00f6ffnet der 2. Tante Enso in Mecklenburg-Vorpommern und die 71. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Seth\n\n Am 12. Juni 2025 er\u00f6ffnet in Seth die 70. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Toppenstedt\n\n Am 22.05.2025 er\u00f6ffnet in Toppenstedt die 69. Tante Enso-Filiale.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Dabel\n\n Am 08.05.2025 um 12 Uhr \u00f6ffnet offiziell der erste Tante Enso in Mecklenburg-Vorpommern.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Mansbach\n\n Am 16.04.2025 um 12 Uhr \u00f6ffnet offiziell der zweite Tante Enso in Hessen seine T\u00fcr.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Rastdorf\n\n Am 11.04.2025 um 12 Uhr er\u00f6ffnet offiziell der 33. Tante Enso in Niedersachsen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Oppenwehe\n\n Am 03.04.2025 um 12 Uhr \u00f6ffnet offiziell der f\u00fcnfte Tante Enso in Nordrhein-Westfalen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Langenstein\n\n Am 27.03.2025 um 12 Uhr \u00f6ffnet offiziell der f\u00fcnfte Tante Enso in Sachsen-Anhalt.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Bernau\n\n Am 26.03.2025 um 12 Uhr er\u00f6ffnet offiziell der zweite Tante Enso in Baden-W\u00fcrttemberg und die 66. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Molzen\n\n Am 20.03.2025 er\u00f6ffnet offiziell der 32. Tante Enso in Niedersachsen und die 65. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Roitzsch\n\n Am 27.02.2025 \u00f6ffnet offiziell der 4. Tante Enso in Sachsen-Anhalt und die 64. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Eimke\n\n Am 30. Januar 2025 er\u00f6ffnet in Eimke die 31. Filiale in Niedersachsen und der 63. Tante Enso bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Hahnenklee\n\n Am 19.12.2024 er\u00f6ffnet in Hahnenklee der 30. Tante Enso in Niedersachsen und die 62. Filiale bundesweit.\n\n Mehr dazu\n Er\u00f6ffnung des Tante Enso Wieren\n\n Am 11. Dezember 2024 wurde es feierlich vor dem Neubau: Nach drei Jahren konnte das Kapitel Nahversorgung im Ort abgeschlossen werden.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Horsten\n\n Am 05.12.2024 er\u00f6ffnet in Horsten der 28. Tante Enso in Niedersachsen und die 60. Filiale bundesweit.\n\n Mehr dazu\n Er\u00f6ffnung in Amelunxen\n (21.11.2024)\n\n 1, 2, 3, Konfetti! Willkommen im Tante Enso!\n\n Mehr dazu\n Er\u00f6ffnung in Kohren-Sahlis\n\n Am 7.11.2024 er\u00f6ffnet in Kohren-Sahlis der 3. Tante Enso in Sachsen und die 58. Filiale bundesweit.\n\n Mehr dazu\n Die Tante Enso-Karten-PIN ist da\n\n Wer auf Nummer sicher gehen m\u00f6chte, kann sich ab jetzt eine PIN einrichten.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Schwabstedt\n\n Am 30.10. 2024 um 12 Uhr er\u00f6ffnet in Schwabstedt die 8. Filiale in Schleswig-Holstein und die 57. bundesweit.\n\n Mehr dazu\n H\u00f6rster Er\u00f6ffnung des Tante Enso\n\n Am 10.10.2024 \u00f6ffnete der dritte Tante Enso in Nordrhein-Westfalen seine T\u00fcren.\n\n Mehr dazu\n Er\u00f6ffnung in Gro\u00df Vollstedt (25.09.2024)\n\n Endlich regnete es Konfetti!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Frauenau\n\n Am 12. September 2024 bekommt Frauenau wieder eine fu\u00dfl\u00e4ufige Nahversorgung. Es ist die 5. Tante Enso-Filiale in Bayern.\n\n Mehr dazu\n Am 7.09.2024 wurde bei sch\u00f6nstem Sonnenschein ausgelassen gefeiert, getanzt & gegessen.\n\n Musikalisch und bewegt: Tante Enso G\u00f6rzig feiert 1. Jubil\u00e4um\n\n Mehr dazu\n Er\u00f6ffnung in Eppenbrunn\n (29.08.2024)\n\n Hei\u00df und bunt war's: Hier k\u00f6nnt ihr die Er\u00f6ffnung noch einmal nacherleben.\n\n Mehr dazu\n Konfetti f\u00fcr Bilshausen\n\n Seit dem 22. August 2024 ist Tante Enso in Bilshausen er\u00f6ffnet.\n\n Mehr dazu\n Volles Pfund Tante Enso: Die 50. Filiale...\n\n ... und ein kleiner Blick zur\u00fcck bei diesem Meilenstein.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Zernien\n\n Am 8. August 2024 er\u00f6ffnet in Zernien der 26. Tante Enso in Niedersachsen und die 50. Filiale bundesweit.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Gro\u00dflehna\n\n Am 25. Juli 2024 bekommt Gro\u00dflehna wieder eine fu\u00dfl\u00e4ufige Nahversorgung. Es ist der 2. Tante Enso in Sachsen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Neuenkirchen\n\n Unter viel Konfetti, Geschenken und guter Laune er\u00f6ffnet in Neuenkirchen die 47. Tante Enso-Filiale bundesweit.\n\n Mehr dazu\n Ummern feiert die 46. Er\u00f6ffnung\n\n Tante Enso hat einen ehemaligen Kneipensaal als Bleibe mit Charakter erhalten.\n\n Mehr dazu\n Feste feiern in Holtsee: Er\u00f6ffnung am 21.06.2024\n\n Endlich wieder eine Nahversorgung! Viele Holtseer kamen, um einen ersten Blick in ihren frisch eingerichteten Tante Enso zu werfen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Abtsdorf\n\n Am 13. Juni 2024 malt das Konfetti den Himmel bunt \u2013 und Abstdorf hat einen Tante Enso!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Barver!\n\n Am 06. Juni 2024 fiel der langersehnte Konfettiregen.\n\n Mehr dazu\n Auch Wassenach kann Tante Enso\n\n Am 5. Juni 2024 \u00f6ffnet in Wassenach der Tante Enso zum ersten Mal offiziell die T\u00fcr.\n\n Mehr dazu\n Auf geht\u2019s, Spieka!\n\n Am 30.05.2024 konntet ihr die Er\u00f6ffnung eurer Filiale feiern.\n\n Mehr dazu\n Tante Enso H\u00fcttenbusch ist er\u00f6ffnet!\n\n Am 16.05.2024 \u00f6ffneten sich im Ort (wieder) die T\u00fcren eines Nahversorgers.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n K\u00fcnsebeck\n\n Blauer Himmel, viel Sonnenschein und noch mehr gute Laune: Am 30. April er\u00f6ffnet Tante Enso in K\u00fcnsebeck.\n\n Mehr dazu\n Tante Enso in Mohrkirch ist er\u00f6ffnet!\n\n Am 25. April 2024 gab\u2019s bei euch den ersehnten Konfettimoment!\n\n Mehr dazu\n Tante Enso Glasau feiert Einj\u00e4hriges!\n\n Alles Gute zum Geburtstag, MarktTreff & Tante Enso!\n Am 23.03.2024 wird ordentlich gefeiert!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Elfershausen\n\n Bei bedecktem Himmel und bester Laune er\u00f6ffnet am 21. M\u00e4rz 2024 der Tante Enso in Elfershausen.\n\n Mehr dazu\n Ostern bei Tante Enso\n\n Wir haben \u00dcberraschungen, Rezepte und Geschenkideen f\u00fcr dich!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Bollendorf\n\n Am 29.02.2024 um 12 Uhr ist es endlich soweit: Bei strahlendem Sonnenschein, Sekt und viel guter Laune \u00f6ffnet der Tante Enso in Bollendorf zum ersten Mal seine T\u00fcr.\n\n Mehr dazu\n Happy Birthday,\n Ehra-Lessien!\n\n Wir feiern am 9. M\u00e4rz 2024\n euren ersten Geburtstag!\n\n Mehr dazu\n Happy Birthday Drangstedt!\n\n Euer Tante Enso feiert\n am 23.02.2024\n den ersten Geburtstag!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Bruckberg!\n\n Die 35. Filiale, davon die 3 in Bayern (sorry, Franken) \u2013 das Wetter kriegte noch die Kurve und die Menschen vor Ort gingen zahlreich vor die T\u00fcr. (01.02.2024)\n\n Mehr dazu\n Eure W\u00fcnsche im Jahr 2023\n\n So viele konnten wir in die Regale bringen.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Nettlingen\n\n Am 18. Januar 2024 ist es soweit: Auch Nettlingen kann Tante Enso!\n\n Mehr dazu\n Profitiere von deinen Einkaufsvorteilen.\n\n In deinem Kundenkonto hast du alles auf einen Blick.\n\n Mehr dazu\n Tante Enso Falkenau ist er\u00f6ffnet!\n\n Am 11. Januar 2024 war es so weit, das Konfetti rieselte in klirrender K\u00e4lte herunter.\n\n Mehr dazu\n Jahresr\u00fcckblick 2023\n\n Wir haben das Jahr einmal kurz filmisch zusammengefasst und freuen uns auf 2024.\n\n Mehr dazu\n Er\u00f6ffnung: Tante Enso Siedenburg!\n\n Der letzte in 2023, mit Konfetti in B\u00f6en\n und fr\u00f6hlich-festlichem Rahmen machte am 21.12. die T\u00fcren auf.\n\n Mehr dazu\n Tante Enso Neu Darchau ist er\u00f6ffnet!\n\n Am 19.12.2023 war es so weit: Unsere 31. und in diesem Jahr vorletzte Filiale ist an den Start gegangen,\n trotz Regen war es ein buntes Fest!\n\n Mehr dazu\n Der erste Geburtstag von Tante Enso Sievern!\n\n Unfassbar, und zack, ist ein Jahr vorbei! Viel wurde schon gew\u00fcnscht,\n und weitere W\u00fcnsche werden in 2024 umgesetzt!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in M\u00fcnnerstadt!\n\n Am 14.12.2023 um 12 Uhr ist es soweit: Auch M\u00fcnnerstadt kann Tante Enso!\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in\n Ihlienworth!\n\n Am 12.12.2023 um Punkt 12 Uhr ist es soweit: Auch Ihlienworth bekommt wieder eine fu\u00dfl\u00e4ufige Nahversorgung!\n\n Mehr dazu\n Tante Enso Emtinghausen ist er\u00f6ffnet!\n\n Am 7. Dezember 2023 war es endlich so weit, unter gro\u00dfem Dorfinteresse\n wurde unsere Bremen-n\u00e4chste Filiale er\u00f6ffnet.\n\n Mehr dazu\n Der Moisburger Tante Enso ist auch er\u00f6ffnet!\n (30.11.2023)\n\n Pr\u00e4chtige Stimmung, Dorffestcharakter und dazu\n noch einkaufen k\u00f6nnen \u2013 Moisburg ist happy.\n\n Mehr dazu\n Tante Enso Aschen ist er\u00f6ffnet!\n\n Am 28. November 2023 war es so weit, das Konfetti\n rieselte mit den ersten Schneeflocken herunter.\n\n Mehr dazu\n Er\u00f6ffnung des Tante Enso in Schweskau!\n\n Bei nieseligem Novemberwetter haben die Besucher\n des bunten Tante Enso fr\u00f6hliche Akzente gesetzt.\n\n Mehr dazu\n Tante Enso Axstedt ist er\u00f6ffnet!\n\n Sch\u00f6n & herbstlich, freudig und voller guter Laune:\n So war eure Er\u00f6ffnung!\n\n Mehr dazu\n Zellas Tanten von der Tante\n\n Zum 1. Jubil\u00e4um zeigt Zella ein paar Impressionen.\n\n Mehr dazu\n Schnega feiert das dritte Jubil\u00e4um\n\n Herzlichen Gl\u00fcckwunsch & feiert am 27.10.23 mit!\n\n Mehr dazu\n Gl\u00fcckwunsch, Tante Enso V\u00f6gelsen!\n\n Am 6.10.2022 wurde die gr\u00f6\u00dfte der Filialen er\u00f6ffnet.\n\n Mehr dazu\n 4!!! Happy birthday, Tante Enso Blender!\n\n Kaum zu glauben: Unser erster Tante Enso auf dem Land ist vier Jahre alt.\n 22 weitere L\u00e4den sp\u00e4ter, besuchen wir euch immer noch gern.\n\n Mehr dazu\n Tante Enso in Sellstedt hat 1. Geburtstag!\n\n Wir gratulieren & haben mal kurz in euren Laden geschaut.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in G\u00f6rzig\n\n Am 7. September 2023 bekommt G\u00f6rzig wieder eine fu\u00dfl\u00e4ufige Nahversorgung. Die Er\u00f6ffnung wird sogar live im Fernsehen \u00fcbertragen.\n\n Mehr dazu\n Happy birthday, Tante Enso Hemmingstedt!\n\n Das erste Jahr ist schon vorbei \u2013\n was wir im n\u00e4chsten noch besser machen wollen.\n\n Mehr dazu\n Barenburgs Tante Enso er\u00f6ffnet am 31. August 2023\n\n Dynamisch war das Wort des Tages \u2013 lest selbst, warum!\n\n Mehr dazu\n Tante Enso in Breddorf ist er\u00f6ffnet!\n\n Gelb wie der Sonnenschein strahlt der neue Tante Enso seit dem 24.08.2023\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in Neuenheerse\n\n Am 17.08.2023 er\u00f6ffnet offiziell Tante Enso in Neuenheerse. Es ist die erste Filiale in Nordrhein-Westfalen.\n\n Mehr dazu\n Bei euch piept's wohl!\n\n Zumindest (wieder) an der Selbst-Checkout-Kasse.\n\n Mehr dazu\n G\u00fclzow blickt auf ein Jahr Tante Enso zur\u00fcck\n\n In Bild & Ton, zum Jubil\u00e4um ein kleiner Film.\n\n Mehr dazu\n Ein Jahr Tante Enso Brekendorf!\n\n Ein kleiner R\u00fcckblick und Impressionen von unserer bisher n\u00f6rdlichsten Filiale.\n\n Mehr dazu\n Filialnews aus Sellstedt\n (Stand 22.05.2023)\n\n Im Tante Enso in Sellstedt wird die Kundschaft direkt lachend begr\u00fc\u00dft. Die Stimmung ist super - und einkaufen gehen die Menschen inzwischen sehr gerne sonntags.\n\n Mehr dazu\n Bald 4 Jahre: Tante Enso in Blender\n\n Unser erster, unser Meilenstein, unser \u00e4ltester: Stimmen aus der Dorfidylle.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in W\u00f6rlitz\n\n Der 20. Tante Enso Markt, der erste in Sachsen-Anhalt: So sch\u00f6n war es am 20. April.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Glasau\n\n Ein richtig tolles Geb\u00e4ude in einem tollen Ort: So war die Er\u00f6ffnung am 23. M\u00e4rz 2023.\n\n Mehr dazu\n Filialnews aus Hemmingstedt\n\n Seit 7 Monaten steht das Team im Tante Enso und freut sich \u00fcber besondere Kunden.\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in Ehra-Lessien\n\n Am 09.03.2023 er\u00f6ffnet in Ehra-Lessien, Niedersachsen, der 18. Tante Enso bundesweit. Der \u00f6rtliche Shanty-Chor untermalt das freudige Ereignis musikalisch.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Drangstedt\n\n Am 23.02.2023 malen die Konfetti-Kanonen den grauen Himmel bunt. Um Punkt 12 Uhr bekommt Drangstedt im Geestland offiziell einen eigenen Tante Enso Mini-Supermarkt.\n\n Mehr dazu\n Tante Enso: Er\u00f6ffnung in Sievern\n\n Am 15.12.2022 wurde das rote Band bei wei\u00dfen Schneeflocken durchtrennt.\n\n Mehr dazu\n Ein Bild und seine Geschichte\n\n Filialnews mal anders.\n Der tierische Kundenparkplatz.\n\n Mehr dazu\n Einzigartig! Der W\u00fcnsch-dir-was Bereich bei myEnso und Tante Enso\n\n Die Ohren und den Stift stets gespitzt, um Kundenw\u00fcnsche zu erf\u00fcllen \u2013 das macht Marcus von Horn bei myEnso. Ein Interview mit dem Projektmanager W\u00fcnsch-dir-was.\n\n Mehr dazu\n Der Nikolaus kommt in die l\u00e4ndlichen Tante Enso Filialen!\n\n Schnappt eure Kinder und Enkel und seid mit Stiefel dabei.\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in Zella\n\n So sch\u00f6n war's am 4.11. in Zella.\n\n Mehr dazu\n Gl\u00fcckwunsch Schnega zu zwei Jahren Tante Enso!\n\n Am 23. Oktober 2020 hat Tante Enso in Schnega zum ersten Mal seine T\u00fcren ge\u00f6ffnet. Es ist der 3. Tante Enso, den myEnso er\u00f6ffnet. Ein paar Impressionen von damals und heute.\n\n Mehr dazu\n \u00dcbersch\u00fcssige Lebensmittel retten\n\n Auch Tante Enso kooperiert mit Too good to go\n\n Mehr dazu\n Tante Enso er\u00f6ffnet in V\u00f6gelsen\n\n Am 06.10.2022 knallen um 12.00 Uhr die Konfetti-Kanonen. Denn der Tante Enso Mini-Supermarkt in V\u00f6gelsen \u00f6ffnet zum ersten Mal seine T\u00fcr.\n\n Mehr dazu\n Wenn es in der Lieferkette hakt...\n\n Warum herrscht bei meinem Tante Enso in einigen Regalen g\u00e4hnende Leere? Wir haben H\u00e9ctor Losada interviewt. Er ist bei uns verantwortlich f\u00fcr Lagerlogistik & Beschaffung.\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in Sellstedt\n\n Am 22.09.2022 hat Sellstedt seinen neuen Tante Enso Mini-Supermarkt er\u00f6ffnet.\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in Hemmingstedt\n\n Am 01.09.2022 er\u00f6ffnete Tante Enso Hemmingstedt.\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in Lilienthal\n\n Am 24.08.2022 er\u00f6ffnete Lilis Tante Enso der Lilienthaler Diakonie.\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in G\u00fclzow\n\n Am 28.07.2022 hat euer Tante Enso Mini-Supermarkt in G\u00fclzow er\u00f6ffnet! Mit Blasmusik, Bratwurst und viel Bravo.\n\n Mehr dazu\n Tante Enso Er\u00f6ffnung in Brekendorf\n\n Am 1. Juli 2022 hat eurer Tante Enso Mini-Supermarkt in Brekendorf er\u00f6ffnet. Mit viel Tantam, Konfetti und hohem Besuch!\n\n Mehr dazu\n Er\u00f6ffnungsfeier: Schwiegershausen begr\u00fc\u00dft Tante Enso!\n\n Ein Einblick in die Er\u00f6ffnung des Tante Ensos in Schwiegershausen.\n\n Mehr dazu\n Er\u00f6ffnungsfeier in Wollbach: Bayern begr\u00fc\u00dft Tante Enso!\n\n Mit viel Engagement zum gemeinsamen Projekt\n\n Mehr dazu\n Die besten Bewerbungsvideos um einen Tante Enso\n\n Wir sind begeistert welche kreativen Videos uns bereits erreicht haben.\n\n Mehr dazu\n Wohlf\u00fchlen auf dem Land - geht das eigentlich noch?\n\n Unser Standpunkt zur ARD-Themenwoche: Stadt.Land.Wandel\n\n Mehr dazu\n Tante Enso \u2013 Was ist passiert in 2021?\n\n Das Gesch\u00e4ftsmodell Tante Enso ist sozusagen \u2013 im positiven \u2013 explodiert!\n\n Mehr dazu\n Zur\u00fcck\n\n Filialen\n\n * Standorte in PlanungBewerbung um einen Tante Enso\n * Unsere FilialenTante Enso-Karte\n * SponsoringKommissionskauf\n\n Online einkaufen\n\n * Lieferung & Versand\n * Zahlungsarten\n * Themen & Marken\n\n Unternehmen\n\n * Die IdeeUnsere WerteNachhaltigkeitsbericht\n * W\u00fcnsch dir wasTeilhaberschaftNeuigkeiten\n * VerantwortlicheKarriereJobs\n\n Hilfe & Kontakt\n\n * \u00d6ffnungszeitenFragen & Antworten\n * F\u00fcr regionale HerstellerPresse\n * Kontakt\n\n Rechtliches\n\n * AGBDatenschutz\n * ImpressumWiderrufsrechtKauf widerrufen\n * Cookie-EinstellungenBarrierefreiheitserkl\u00e4rung\n\n Mehr von uns findest du hier:\n\n * \n * \n * \n * \n * DE-\u00d6KO-006\n * \n * \n * 4,55 (15,3k) Hervorragend\n \u00a9 Tante Enso 2026", "preview_url": "https://changes.sotzny.net/preview/c8bd8ee7-ee7b-4d9c-8461-d838cc9e155e", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "c8bd8ee7-ee7b-4d9c-8461-d838cc9e155e", "watch_mime_type": "text/html;charset=utf-8", "watch_tag": "", "watch_title": "Neuigkeiten aus eurem Tante Enso", "watch_url": "https://www.tanteenso.de/content/tanteenso/standorte/grosslehna/neuigkeiten", "watch_open_url": "https://www.tanteenso.de/content/tanteenso/standorte/grosslehna/neuigkeiten", "watch_uuid": "c8bd8ee7-ee7b-4d9c-8461-d838cc9e155e", "notification_urls": ["tgram://bot6153202443:AAFH-WOYMweQ8XnRHMd07_flhICRQGPYD5E/132248989"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\r\n---\r\n{{diff}}\r\n---\r\n", "notification_format": "text", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changes.sotzny.net/edit/c8bd8ee7-ee7b-4d9c-8461-d838cc9e155e"}}]