v0.55.1

Try our Chrome extension

Chrome store icon Chrome Webstore

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;

The more popular changedetection.io is, the more time we can dedicate to adding amazing features!

Many thanks :)

changedetection.io team

Bildirim hata ayıklama günlüğü

  • Wed 29 Apr 2026 02:46:50 PM - SENDING - [{"title": "Changedetection.io \u00c4nderungsmitteilung", "body": "Auf https://changedetection.io/CHANGELOG.txt hat sich etwas ge\u00e4ndert:<br>\n---<br>\nhttps://change.bvs-kassen.de/diff/c47245b6-2403-41f5-8635-e3d47f5e2c80<br>\n---<br>\n<span style=\"background-color: #fadad7; color: #b30000;\" role=\"note\" aria-label=\"Changed text\" title=\"Changed text\">HEAD / 2026-04-29 09:11:03 +0200:</span><br>\n<span style=\"background-color: #eaf2c2; color: #406619;\" role=\"note\" aria-label=\"Changed into\" title=\"Changed into\">HEAD / 2026-04-29 12:10:47 +0200:</span><br>\n<span style=\"background-color: #eaf2c2; color: #406619;\" role=\"note\" aria-label=\"Changed into\" title=\"Changed into\"> - API - Add restock config to API /v1/watch/ json output #4099 (#4103)</span><br>\n<span style=\"background-color: #eaf2c2; color: #406619;\" role=\"note\" aria-label=\"Changed into\" title=\"Changed into\"> - API - watch.link was accidently a tuple, enforcing string (#4104)</span><br>\n---<br>\n&lt;html&gt;&lt;head&gt;&lt;meta name=&#34;color-scheme&#34; content=&#34;light dark&#34;&gt;&lt;/head&gt;&lt;body&gt;&lt;pre style=&#34;word-wrap: break-word; white-space: pre-wrap;&#34;&gt;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp; _&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp; _&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp; <br>\n __| |_&nbsp;&nbsp;__ _ _ _&nbsp;&nbsp;__ _ ___ __| |___| |_ ___ __| |_(_)___ _ _&nbsp;&nbsp; (_)___ <br>\n/ _| &#39; \\/ _` | &#39; \\/ _` / -_) _` / -_)&nbsp;&nbsp;_/ -_) _|&nbsp;&nbsp;_| / _ \\ &#39; \\ _| / _ \\<br>\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|___/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>\n<br>\nHEAD / 2026-04-29 12:10:47 +0200:<br>\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)<br>\n - API - watch.link was accidently a tuple, enforcing string (#4104)<br>\n - i18n: Add dennis .pot/.po lint (#4097)<br>\n - Improve LiteLLM deps #4093 (#4102)<br>\n - UI - AI/LLM - &#34;Summary&#34; button should set last viewed (#4095)<br>\n - Ruff INT (flake8-gettext) (#4096)<br>\n<br>\n - 0.55.3<br>\n<br>\n - Recompile languages<br>\n - 0.55.2<br>\n - typo: {{diff_url}} token mentioned twice (#4094)<br>\n - i18n: UI - Align desktop &#34;Last Checked&#34; / &#34;Last Changed&#34; with mobile (#4090)<br>\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091<br>\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)<br>\n - i18n - Recompile languages<br>\n<br>\n - 0.55.1<br>\n - Security - Hardening XML parser against XXE<br>\n - Security - Stored XSS via Tag Name in Modal Dialog<br>\n - Security - Arbitrary Local File Read via crafted backup restore<br>\n - i18n - Update Korean language (#4084)<br>\n - [i18n] &#34;Usage&#34; tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)<br>\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)<br>\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)<br>\n - LLM / AI Change detection rules and Summaries<br>\n - Bumping README<br>\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)<br>\n - CI - Translation sync check (#4085)<br>\n - Update python-engineio requirement from &amp;lt;5,&amp;gt;=4.9.0 to &amp;gt;=4.13.1,&amp;lt;5 (#4079)<br>\n - CI - Re #4080 msgfmt linting (#4081)<br>\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)<br>\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)<br>\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)<br>\n<br>\n - 0.54.10<br>\n - UI - Fix unresponsive &#34;Show advanced help and tips&#34; button on tag edit screen (#4055)<br>\n - Fix untranslated labels on mobile watchlist view (#4064)<br>\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)<br>\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)<br>\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)<br>\n<br>\n - 0.54.9<br>\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)<br>\n - Translations - JA - Recompile<br>\n - Fix strings not rendered in user&#39;s locale despite having .po entries (#4051)<br>\n - Update Japanese translations for new strings and fix fragment handling (#4050)<br>\n - Notifications - Discord #3721 - Dont use &amp;amp;nbsp; for discord (Actually Discord:// notifications should always use plaintext format anyway)<br>\n - Test improvement - text extract tidyup (#4048)<br>\n - Text filters - New simpler filter &#34;Extract lines containing text&#34; (#4046)<br>\n - Handle inline favicons (#4047 #3891 )<br>\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777<br>\n - Add complete Turkish translation (#4044)<br>\n - Czech l12n updates (#4043)<br>\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)<br>\n - Test - word-level diff - Re #4037 - adding test (#4042)<br>\n - Fix/step failure notification crash (#4041)<br>\n - Groups - Set custom colour for tag/group/label background (#4040)<br>\n - fix: pass include_change_type_prefix to word-level diff (#4037)<br>\n - Add Portuguese (Brasil) translation (#4033)<br>\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)<br>\n - diff_changed_from/diff_changed_from tokens - improve documentation<br>\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)<br>\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)<br>\n - UI - Minor text fix and add link to &#39;Restock Backup&#39; from Imports<br>\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)<br>\n - Add Japanese translation (ja) (#4019)<br>\n - UI - German translation: Visual Filter: &#34;Klare Auswahl&#34; is very misleading #4023<br>\n<br>\n - 0.54.8<br>\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering<br>\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)<br>\n - Ensure all unit tests are run (#4022)<br>\n - Extendable theme pluggy implementation for main theme/template `&amp;lt;head&amp;gt;` section&nbsp;&nbsp;(#4011)<br>\n - Update docker-compose.yml<br>\n - Update docker-compose.yml<br>\n<br>\n - 0.54.7<br>\n - Translations - recompiling<br>\n - fix: Czech translation strings updated (#4008)<br>\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )<br>\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters<br>\n - UI - Settings - Dont let &#39;password&#39; field autocomplete (chrome)<br>\n - `last_error` should be cleared if page content was the same and there was no error (#3997)<br>\n - fix: correct critical errors in Spanish (es) translation (#3994)<br>\n - Restock - Add previous_price to restock values #3987 (#3993)<br>\n - UI - Scan/check all proxies - Regression fix from earlier refactor<br>\n - Realtime - Suppress socket.io errors in logs (#3991)<br>\n - UI - Text tidyup (#3989)<br>\n<br>\n - 0.54.6<br>\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)<br>\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)<br>\n - fix: add commit calls for pause and mute operations (#3978)<br>\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)<br>\n<br>\n - 0.54.5<br>\n - CI - YML tidyup<br>\n - Docker image - Improving org.opencontainers labels for dev containers<br>\n - Docker image - Improving org.opencontainers labels #3794<br>\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)<br>\n - UI - Fixing Preview &#34;GO&#34; version button (#3969)<br>\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)<br>\n - Add complete Spanish translation (es) (#3961)<br>\n - Various memory and CPU improvements (#3960)<br>\n - CI - Bump the all group with 5 updates (#3955)<br>\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)<br>\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)<br>\n - Restock - No need to extract the text because it&#39;s not used anyway (#3951)<br>\n<br>\n - 0.54.4<br>\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response<br>\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()<br>\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases<br>\n - Updating API docs with better processor plugin info (#3942)<br>\n - Python 3.14 CI test and support (#3941)<br>\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)<br>\n<br>\n - 0.54.3<br>\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)<br>\n - Adding Ukranian translations, rebuilding translations. (#3936)<br>\n - Update messages.po in French translation (#3926)<br>\n<br>\n - 0.54.2<br>\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)<br>\n - CI workflow - Bump the all group with 2 updates (#3931)<br>\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)<br>\n - API - Processors configuration is now part of the API&nbsp;&nbsp;(#3902)<br>\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)<br>\n - Fixing `change_datetime` notification token (and adding test) (#3922)<br>\n<br>\n - 0.54.1<br>\n - Tests - Tweaks to upgrade path tests<br>\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true<br>\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.<br>\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request<br>\n<br>\n - 0.53.7<br>\n - Libraries/Build - unpin referencing library (#3919)<br>\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)<br>\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)<br>\n<br>\n - 0.53.6<br>\n - Pip installs - remove flask patch and pin library versions<br>\n - Lazy load flask_compress<br>\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress &amp;amp; socket.io<br>\n<br>\n - 0.53.5<br>\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)<br>\n - UI - Backup restore (#3899)<br>\n<br>\n - 0.53.4<br>\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)<br>\n - UI - Search modal - fixes for running in sub path<br>\n - Puppeteer - Adding extra browser cleanup (#3897)<br>\n - Puppeteer - Use a modern scroll method for screenshot stitching<br>\n - UI - CSS - Ensure &#39;difference&#39; &#39;preview&#39; both wraps by word and by very long strings<br>\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)<br>\n - Fix: Some SPA&#39;s also set body content to display: none which breaks text output<br>\n - &#34;Error 200 no content&#34; - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)<br>\n - UI - Filters &amp;amp; Triggers - Adding reminder that you can also use &#39;Conditions&#39; for trigger rules<br>\n - Minor code tidy<br>\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)<br>\n - UI - More fixes for realtime updates<br>\n - UI - Fixing realtime updates for status updates when checking (#3889)<br>\n - Pluggy plugin hook for before and after a watch is processed (#3888)<br>\n<br>\n - 0.53.3<br>\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)<br>\n - UI - Use version from code in version tab<br>\n<br>\n - 0.53.2<br>\n - UI - Watch overview - Restock price, validate number before output (#3883)<br>\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)<br>\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories<br>\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources<br>\n - Browser Steps - Minor code cleanup<br>\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons<br>\n<br>\n - 0.53.1<br>\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)<br>\n - Test - Improve test for watch package download<br>\n - UI - Watch data download, fix test, update text.<br>\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)<br>\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.<br>\n - Avoid reprocessing if the page was the same (#3867)<br>\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)<br>\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)<br>\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)<br>\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)<br>\n - Refactoring upgrade path (#3861)<br>\n - API - Import use background task to import large lists (#3858)<br>\n - API - Bumping docs<br>\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&amp;amp;time_between_check={&#39;hours&#39;:24}&nbsp;&nbsp;Re #3845 (#3857)<br>\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)<br>\n - UI - Bulk checkbox operations modal confirmation fix Re #3853<br>\n - Tags update fix (#3849)<br>\n - Refactor for Tags storage (#3848)<br>\n - Including uptime in UI settings/info<br>\n - Refactor&nbsp;&nbsp;watch saving backend, closes #3846 (#3847)<br>\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)<br>\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)<br>\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833<br>\n - Rebuild translations (#3842)<br>\n - UI - Favicon use lazy load for faster rendering<br>\n - Adding more tests and Watch object improvements (#3841)<br>\n - Improved watch global settings handling (#3839)<br>\n - New datastore message should be warning not critical<br>\n - Improving upgrade path<br>\n - History length limit size option (#3834)<br>\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)<br>\n - Favicon path - cache results<br>\n - UI - Backups tab - styling fix<br>\n - Styling fix for &#34;backups&#34; tab Re #3821<br>\n - UI- Fix possible bug adding tags in quickwatch form<br>\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)<br>\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)<br>\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)<br>\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)<br>\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)<br>\n - UI - Move Default Proxy selection back to &#34;General&#34; tab<br>\n - API - Notification URLs werent always being validated (#3812)<br>\n - Remove deprecated call to strtobool<br>\n - UI - Make watch tags link elements (#3813)<br>\n - test tweak<br>\n - DB data migration upgrade fixes (#3811)<br>\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)<br>\n - Improved catching of errors/exceptions in Browser Steps steps&nbsp;&nbsp;(#3808)<br>\n - Improving default settings for remote reverse proxies (#3806)<br>\n - CLI extra options,&nbsp;&nbsp;&#34;batch mode&#34; see `--help` allows re-checking and adding watches from the CLI (#3802)<br>\n - Update messages.po // German (#3797)<br>\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)<br>\n<br>\n - 0.52.9<br>\n - Memory management improvements&nbsp;&nbsp;for large screenshots, Brotli snapshot improvements (#3798)<br>\n - Updating site.webmanifest for PWA usage<br>\n - Use credentials to fetch web manifest (#3790)<br>\n - Make language selection sticky and provide a way to return back to default auto-detect&nbsp;&nbsp;#3792 (#3795)<br>\n - Element locking &#39;off&#39; by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)<br>\n - Rebuilding language translation files<br>\n - Update French translation (#3788)<br>\n - Open github link on new tab (#3791)<br>\n - Update messages.po // German &#34;From&#34; (#3793)<br>\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794<br>\n<br>\n - 0.52.8<br>\n - Memory - Favicon reader had a memory leak,&nbsp;&nbsp;Restart fetch workers between jobs, misc tweaks&nbsp;&nbsp; (#3787)<br>\n - API -&nbsp;&nbsp;Validation improvements (#3782)<br>\n - i18n - zh traditional chinese autodetect from browser fix<br>\n - UI - Fixes for search dialog #3778 (#3781)<br>\n<br>\n - 0.52.7<br>\n - Fix zh PO duplicates and complete new translations. (#3773)<br>\n - Lots of translation updates (#3772)<br>\n - UI - Global &#34;mute&#34; and &#34;pause&#34; buttons on main menu, move &#34;Backups&#34; to &#34;Settings&#34; (#3769)<br>\n - API &amp;amp; UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)<br>\n - Non blocking improvements (#3767)<br>\n - Improvements to deterministic fix (false triggers) (#3766)<br>\n - Run &#34;clear all history&#34; in background thread to prevent blocking (#3765)<br>\n - Test - Adding missing test<br>\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)<br>\n - Language updates (#3764)<br>\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.<br>\n - UI - Fixing link to scheduler help/tutorial page.<br>\n - Manual update of DE language (and recompile all languages)<br>\n - Recompile CSS<br>\n - UI - Mobile - Empty page watches message and layout improvements (#3760)<br>\n - UI - CSS - Give dark-mode switching a soft transition<br>\n - Edit - More reliable fetch of watch on test (usually affects tests)<br>\n - Manual polish for several translations in the zh locale. (#3757)<br>\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.<br>\n - Languages - Recompile languages, small fix for &#39;de&#39;.<br>\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)<br>\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)<br>\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)<br>\n - 0.52.6<br>\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)<br>\n - UI - Show queue size above watch table in realtime<br>\n<br>\n - 0.52.5<br>\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)<br>\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo<br>\n - i18n: Update zh_Hant_TW translations (#3745)<br>\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)<br>\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737<br>\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)<br>\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)<br>\n<br>\n - 0.52.4<br>\n - Fixing Traditional Chinese locale mapping #3737 (#3738)<br>\n - Languages - Pypi/pip package was missing translations<br>\n<br>\n - 0.52.3<br>\n - UI - Groups - Adding &#39;Recheck&#39; button from groups overview page<br>\n - Minor playwright memory cleanup improvements (#3736)<br>\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)<br>\n<br>\n - 0.52.2<br>\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.<br>\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)<br>\n - UI - Language modal - flag icons should be round<br>\n<br>\n - 0.52.1<br>\n - Development branch merge into release/master<br>\n - Adding test for #3720<br>\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)<br>\n - Update README.md - Info about setting up different viewport sizes<br>\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)<br>\n - API - Watch get, retry watch data if watch dict changed (more reliable)<br>\n - Notification debug log - Use locale of system for dates/times<br>\n - Misc small HTML Validation fixes (#3704)<br>\n<br>\n - 0.51.4<br>\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)<br>\n - Bump actions/checkout from 5 to 6 in the all group (#3651)<br>\n - Specify UTF-8 encoding for xpath_element_js (#3650)<br>\n - Update playwright library to 1.56<br>\n<br>\n - 0.51.3<br>\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)<br>\n<br>\n - 0.51.2<br>\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.<br>\n<br>\n - 0.51.1 Fixing semver version number<br>\n<br>\n - 0.51.01<br>\n<br>\n - 0.51.00<br>\n - UI - Minor text fix for anon history access<br>\n - RSS per watch tweaks (#3635)<br>\n - RSS Feed per watch - Setting order (newest changes first) (#3634)<br>\n - UI - Moving &#39;RSS&#39; options to its own settings tab, RSS - Adding watch history length&nbsp;&nbsp;(#3633)<br>\n - RSS per group! (#3632)<br>\n - UI - Move &#39;Jitter seconds&#39; settings tab from &#34;General&#34; to &#34;Fetching&#34; global Settings.<br>\n - README typo fix and ignore files for emacs style backups<br>\n - RSS feeds for a single watches!<br>\n - Always backup JSON DB on new versions as well as the existing between updates.<br>\n<br>\n - 0.50.43<br>\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms&nbsp;&nbsp;#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<br>\n - Adding data sanity checks across restarts (#3629)<br>\n<br>\n - 0.50.42<br>\n - Revert &#34;Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)&#34;<br>\n<br>\n - 0.50.41<br>\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)<br>\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)<br>\n<br>\n - 0.50.40<br>\n - Page &amp;lt;title&amp;gt; should only be captured on HTML documents (#3608)<br>\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)<br>\n - Real time UI - Remove polling thread for updates - it&#39;s all done realtime by signals (#3603)<br>\n - Watch history - Don&#39;t rescan whole history.txt when looking up a timestamp &amp;lt;-&amp;gt;filepath (#3602)<br>\n - Datastore - Use `orjson` for faster saves (#3601)<br>\n - Scheduler - Saving a couple of CPU cycles in logging strategy<br>\n<br>\n - 0.50.39<br>\n - Time scheduler - Remove cache on time lookup<br>\n - Tests - Adding extra placemarker tests (#3592 #3591 )<br>\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)<br>\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)<br>\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)<br>\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)<br>\n - API - Adding better explanation and usage of History API, bumping doc versions.<br>\n - API - Rebuilding HTML docs<br>\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.<br>\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)<br>\n<br>\n - 0.50.38<br>\n - Improved send test notification handling (#3579)<br>\n<br>\n - 0.50.37<br>\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -&amp;gt; `&amp;lt;br&amp;gt;` etc (#3577) #3538 #3576<br>\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)<br>\n<br>\n - 0.50.35<br>\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573<br>\n - API - Updating index.html of the documentation<br>\n - Optimisations to GitHub test flow<br>\n<br>\n - 0.50.34<br>\n - Fixes to notification &#39;`Send test notification`&#39; (#3571)<br>\n - HTML Notification - Adjusting font to rem size<br>\n - Run all pytests in parallel (#3569)<br>\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)<br>\n - Build/test - Parallel test jobs for faster testing (#3568)<br>\n - Handle `format=` in apprise URLs (#3567)<br>\n - Adding small amount of cache to common functions (#3565)<br>\n - CVE-2025-62780 - Stored XSS in Watch update via API<br>\n<br>\n - 0.50.33<br>\n - Fixing wrong notification type in &amp;lt;select&amp;gt; that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)<br>\n - HTML - Shorten whitespace around timezone names<br>\n - Update 21 for #3496 - Fixing update of timezone setting<br>\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556<br>\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)<br>\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)<br>\n - Build - Actions / Bump the all group with 2 updates (#3550)<br>\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)<br>\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)<br>\n<br>\n - 0.50.32<br>\n - Tests - API - Import - Removed &#39;content-type&#39;: &#39;text/plain&#39; from the test because this should be assumed.<br>\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542<br>\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)<br>\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)<br>\n - Notifications - `post://&#39;, `put://` etc - Catch and show errors and where possible (#3543)<br>\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)<br>\n<br>\n - 0.50.31<br>\n - Changes to colors HTML notification (small contrast between &#39;changed&#39; and &#39;removed&#39; etc) (#3540)<br>\n - tgram:// and discord:// - Small fix for line breaks<br>\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)<br>\n<br>\n - 0.50.30<br>\n - Notifications fixes (#3534) #3531 #3530 #3529<br>\n - Template - Adding `|regex_replace` Re #3501 (#3536)<br>\n - Be sure that default namespaces are registered (#3535)<br>\n<br>\n - 0.50.29<br>\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)<br>\n - Notifications - Refactor/cleanup notification handling and rename &#39;Markdown&#39; to &#34;Markdown to HTML&#34; to make more sense. (#3527) Re #3526 -<br>\n - UI - Fix watch table striping on delete #3523<br>\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)<br>\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)<br>\n - Update beautifulsoup4 requirement (#3471)<br>\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)<br>\n<br>\n - 0.50.28<br>\n - Email notification format fixes (#3525)<br>\n - Empty &#34;ignore text&#34; lines could break ignore text and prevent changes from being detected (#3524)<br>\n<br>\n - 0.50.27<br>\n - Fix error handling for first empty filter response (#3516)<br>\n<br>\n - 0.50.26<br>\n - pip build - Improving fix for #3509, Adding automated test for #3509<br>\n<br>\n - 0.50.25<br>\n - pip build - Be sure to include API spec (#3511)<br>\n - Improved watch delete (#3510)<br>\n - Notification service improved failure alerts for filter missing + browsersteps&nbsp;&nbsp;problems (#3507)<br>\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)<br>\n<br>\n - 0.50.24<br>\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)<br>\n<br>\n - 0.50.23<br>\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now &#39;Europe/London&#39;, &#39;%Y-%m-%d&#39; %}` etc (#3496)<br>\n<br>\n - 0.50.22<br>\n - Testing - Adding test for requests timeout setting #975<br>\n - UI - Add missing &#39;requests timeout in seconds&#39; field to main settings, Re #975<br>\n - UI - Proxy and external browser settings URL validation (#3494)<br>\n - Move proxy default selection to proxy tab<br>\n - Build - Splitting memory report (#3493)<br>\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)<br>\n<br>\n - 0.50.21<br>\n - Adding &#39;RSS reader mode&#39; (see main Settings) (#3488)<br>\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends &#34;text/xml&#34; instead of the &#34;application/atom+xml&#34; header (#3487)<br>\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)<br>\n - No need to reformat/reprocess content in the case that no filters were found&nbsp;&nbsp;(#3484,&nbsp;&nbsp;#3483)<br>\n<br>\n - 0.50.20<br>\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)<br>\n<br>\n - 0.50.19<br>\n - Test speedup - remove common calls for function calls (#3477)<br>\n - Reducing memory usage (#3476)<br>\n - Refactoring text/html difference processor (#3475)<br>\n<br>\n - 0.50.18<br>\n - Always follow plaintext header over the actual content type if its available (#3473) #3472<br>\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)<br>\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)<br>\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)<br>\n<br>\n - 0.50.17<br>\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465)&nbsp;&nbsp;#3462&nbsp;&nbsp;#3391<br>\n - Dependabot tweaks<br>\n<br>\n - 0.50.16<br>\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)<br>\n<br>\n - 0.50.15<br>\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)<br>\n - Filters - Adding &#34;Strip ignored lines&#34; in output option to filters (#3449)<br>\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)<br>\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8<br>\n - Build - Pinning library versions to fix tests<br>\n - Notifications - Upgrade Apprise 1.9.4 (#3443)<br>\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)<br>\n - UI - Implementation of unread counter - adding test<br>\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)<br>\n<br>\n - 0.50.14<br>\n - Time interval field - Extra validation improvements and tests (#3432)<br>\n - UI - Fixing HTML &amp;lt;title&amp;gt; versus custom title settings display in overview (#3430) #3429<br>\n - API - Adding page title link, bumping docs (#3431)<br>\n - &#34;Time between check&#34; field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)<br>\n<br>\n - 0.50.13<br>\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)<br>\n - Always extract page &amp;lt;title&amp;gt;, `{{watch_title}}` added to notification body tokens (#3415)<br>\n - UI - Correctly set &#39;checking now&#39; status badge on edit page<br>\n - Add noindex meta (#3416)<br>\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)<br>\n - Restock - Add &#39;nicht mehr lieferbar&#39; to stock status checks (#3410)<br>\n<br>\n - 0.50.12<br>\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)<br>\n - UI - Added &#34;unread&#34; view filter (#3393)<br>\n - Enable &#34;last_viewed&#34; field in the watch API. (#3403)<br>\n - Update docker-compose.yml - Include mac port info warning<br>\n<br>\n - 0.50.11<br>\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)<br>\n - Cryptography library - pinning version<br>\n - UI - Improving &#34;real-time updates offline&#34; message<br>\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397<br>\n - Update api-spec.yaml<br>\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)<br>\n - API Docs - Improve descriptions<br>\n - API Doc rebuild<br>\n - Bump API Docs slightly<br>\n - Update settings.html text<br>\n - API - Use OpenAPI docs (#3384)<br>\n - Refactor API Documentation (#3383)<br>\n - Updating API documentation<br>\n - Favicons in list - Prefer best/highest quality (#3351)<br>\n<br>\n - 0.50.10<br>\n - API - Recheck by tag #3356 (#3378)<br>\n - Cleanup empty queue messages Re #3376 (#3377)<br>\n<br>\n - 0.50.9<br>\n - Bump actions/checkout from 4 to 5 in the all group (#3373)<br>\n - Refactoring queue handling (#3363)<br>\n - Build - rPi - Cryptography lib not needed (#3365)<br>\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)<br>\n - Conditions &amp;amp; API - Fix set Conditions by API&nbsp;&nbsp;(#3349)<br>\n<br>\n - 0.50.8<br>\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)<br>\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)<br>\n - Re #3337 - UI - Various fixes for &#39;Extract Data&#39; (#3341)<br>\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321<br>\n<br>\n - 0.50.7<br>\n - UI - Set default favicon, handle default &#39;not set&#39; for new/updated installations<br>\n - UI - Set default favicon, offer option to disable favicons (#3316)<br>\n - README - Updating screenshot (with better cropping)<br>\n - README - Updating screenshot<br>\n - UI - Mobile CSS tweaks<br>\n - UI - Mobile - Small tidyups for mobile use<br>\n - UI - CSS - Modernising stylesheet build<br>\n<br>\n - 0.50.6<br>\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)<br>\n - Fixing ARMv7 docker image support for older devices (#3311)<br>\n - UI - Favicons - Try /favicon.ico if no other was specified in the document<br>\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime<br>\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.<br>\n - UI - Lazy load favicons so it doesnt block realtime and other operations<br>\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)<br>\n - UI - Sort list by Running or Paused #3284 (#3294)<br>\n - Similarity condition - Skip generating stats for very large documents in the &#39;Edit&#39; page (#3296)<br>\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the &#39;history&#39; page automatically (#3293)<br>\n - Update stock-not-in-stock.js Added &#39;backorder&#39; and &#39;more on order&#39;<br>\n - Update README.md<br>\n<br>\n - 0.50.5<br>\n - Update README-pip.md<br>\n - Update README.md<br>\n - Update README.md<br>\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)<br>\n - Conditions - Fixing &#34;Does NOT contain&#34; condition (#3279 / #3272 )<br>\n - Update README.md<br>\n - Update LICENSE<br>\n<br>\n - 0.50.4<br>\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list<br>\n - Better path cross-platform file handling (#3265)<br>\n<br>\n - 0.50.3<br>\n - Realtime UI - Prefer websocket then fallback to &#39;polling&#39; mode, increase reconnecting retries.<br>\n - UI - Fixing Watch &#39;set viewed&#39; by tag #3253 (#3258)<br>\n - UI - Always unset &#39;unviewed&#39; state when &#39;[History]&#39; button&nbsp;&nbsp;is pressed from watch overview list #3243<br>\n - UI - Tweak UI option text description for &#39;Open history page in new tab&#39; setting<br>\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)<br>\n - Realtime UI - Delete watch should update in realtime ( #3255 )<br>\n - UI - Quick watch add form color fix<br>\n - Application via HTTPS support -&nbsp;&nbsp;Adding SSL setup and automated test (#3247) (#3252)<br>\n - Browser Steps - Fix for `source:` URLs fix (#3254)<br>\n - UI - Restyle of &#34;quick watch add form&#34; above watchlist<br>\n - UI - Don&#39;t restrict page content box to 80% width (#3251)<br>\n - UI - #3236 fix duplicate icon in watchlist<br>\n - Data store - use original formatted data write<br>\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)<br>\n - UI - Realtime - Add realtime warning to page if server goes offline<br>\n - Browser Steps - Better support for sites that redirect on click/login etc<br>\n - Restock detector - Update texts (#3234)<br>\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)<br>\n - Build test - Build test for platforms in parallel (#3229)<br>\n - BrowserSteps - remove unsupported exception class<br>\n<br>\n - 0.50.2<br>\n - 0.50.1<br>\n<br>\n<br>\n - 0.50.01<br>\n - UI - Adding missing icons lib<br>\n - Use pip build cache from inside Dockerfile (#3228)<br>\n - UI - Also uncheck &#39;check all&#39; checkbox for group operations in realtime mode<br>\n - UI - Real time - checkbox operations now realtime without reload<br>\n - UI - Revert icon changes<br>\n - Building - Use GHA layer caching (#3227)<br>\n - UI - Realtime - Fixing &#39;last_changed&#39; status re #3224<br>\n - Realtime UI - Socketio tweaks and refactor (#3220)<br>\n - Code - Fix dep warning (#3221)<br>\n - Realtime UI - Reducing log output<br>\n - UI - Reword restock detector plugin description<br>\n - UI - Remove incorrect error text<br>\n<br>\n - 0.49.18<br>\n - Realtime UI updates via WebSocket (#3183)<br>\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)<br>\n - UI - Update &#39;Browser Steps&#39; UI text<br>\n - Code - Remove unused f-strings (#3209)<br>\n - Use logger.debug for playwright console logs (#3201)<br>\n<br>\n - 0.49.17<br>\n - Resolve warnings of bs4 library (#3187)<br>\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)<br>\n<br>\n - 0.49.16<br>\n - Fixes to ensure proxy errors are handled correctly (#3168)<br>\n - UI - Custom headers should have validation (#3172)<br>\n - Update selenium library (#3170)<br>\n - Restock detection - adding new string<br>\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)<br>\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)<br>\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)<br>\n - Improved global ignore test (#3140)<br>\n - Update docker-compose.yml (#3149)<br>\n - Small fix for xpath element scraper (#3145)<br>\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108<br>\n - Browser Steps - &amp;lt;Select&amp;gt; by Option Text - #1224, #1228 (#3138)<br>\n - Browser Steps - error reporting and session shutdown improvements (#3137)<br>\n<br>\n - 0.49.15<br>\n - Visual Selector &amp;amp; Browser Steps - Always recheck if the data/screenshot is ready under &#34;Visual Selector&#34; tab after using Browser Steps (#3130)<br>\n - App logs - Send TRACE and INFO logs to stdout (#3051)<br>\n - Development: introduce Ruff as linter/formatter (#3039)<br>\n - Updating restock texts (#3124)<br>\n - Only add screenshot warning if capture was greater than trim size (#3123)<br>\n<br>\n - 0.49.14<br>\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)<br>\n - docs: Update reference URL (#3119)<br>\n - UI - Fix to edit and groups template<br>\n - Updating API documentation<br>\n - Undo forced selenium headless mode, small refactor (#3112)<br>\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)<br>\n - Memory management -&nbsp;&nbsp;Run HTML to text in sub process, a few more cleanups&nbsp;&nbsp;to playwright (#3110)<br>\n - UI Edit/Stats - Add levenshtein distance info, explains how &#34;different&#34; the last two snapshot are (#3109)<br>\n<br>\n - 0.49.13<br>\n - API - Added notifications API endpoints (#3103)<br>\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)<br>\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)<br>\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)<br>\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)<br>\n - Update other methods to use updated screenshot handler (#3098)<br>\n - Memory fixes for large playwright screenshots (#3092)<br>\n - Filters - Support multi line regex&nbsp;&nbsp;(#2889)<br>\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)<br>\n - README.md update - Including blurb about &#39;conditions&#39;<br>\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)<br>\n - Make chrome browser headless when checking the site with selenium (#3095)<br>\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)<br>\n - UI - &#34;Recheck all&#34; should also queue most overdue first&nbsp;&nbsp;(same like automatic scheduler) (#3087)<br>\n - Groups - Including &#34;Extract text&#34;, &#34;Text to ignore&#34;, &#34;Trigger text&#34; and &#34;Text that should not be present&#34; filters<br>\n<br>\n - 0.49.12<br>\n<br>\n - 0.49.11<br>\n<br>\n - 0.49.10<br>\n - Update README.md<br>\n - UI - &#34;Conditions&#34; section, making the Conditions setup table work better on mobile/responsive<br>\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)<br>\n - Python 3.11 container base (#3077)<br>\n - Use lowercase static asset filenames<br>\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)<br>\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)<br>\n - Update edit.html - linking to tutorial<br>\n - Code - Tidy up lint errors (#3074)<br>\n - UI - Update edit.html- xPath support text for 1 &amp;amp; 2<br>\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)<br>\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)<br>\n - UI - Watch edit - &#34;Clone&#34; Should be &#34;Clone &amp;amp; Edit&#34; without watch history, redirect to the new edit page (#3063 #2782)<br>\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)<br>\n - UI - Tidy up support links<br>\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)<br>\n<br>\n - 0.49.9<br>\n - RSS Fixes and improvements - Ability to set &#34;RSS Color HTML Format&#34; in Settings, detect and filter content with bad content that could break RSS (#3055)<br>\n<br>\n - 0.49.8<br>\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)<br>\n - API - Adding &#34;Search&#34; API (#3052)<br>\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)<br>\n<br>\n - 0.49.7<br>\n - Adding Tags/Groups API (#3049)<br>\n<br>\n - 0.49.6<br>\n - API Access should still work even when UI Password is enabled (#3046) #3045<br>\n<br>\n - 0.49.5<br>\n - Template tidyup &amp;amp; UI Fixes (#3044)<br>\n - Watch history -&nbsp;&nbsp;Ensure atomic/safe history data disk writes (#3042 #3041)<br>\n - Testing - Replace Linux only &#39;resource&#39; library with cross-platform &#39;psutil&#39; library (#3037)<br>\n - Refactor code layout, add extra tests<br>\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc<br>\n<br>\n - 0.49.4<br>\n - Datastore - Always use utf-8 encoding for error text output storage<br>\n -&nbsp;&nbsp;Restock detection - Adding french keywords for out of stock items<br>\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied<br>\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)<br>\n - Browser Steps - Added new &#34;Make all child elements visible&#34; action<br>\n - Browser Steps - Added new &#34;Remove elements&#34; action<br>\n - UI - Browser Steps - &#34;Click X,Y&#34; should focus on the input field also<br>\n - UI - Browser Steps - Improving Browser Steps usability on mobile<br>\n<br>\n - 0.49.3<br>\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)<br>\n<br>\n - 0.49.2<br>\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)<br>\n - Update docker-compose.yml<br>\n - UI - More W3C HTML validation fixes<br>\n - UI - More W3C validation fixes (#2973)<br>\n - UI - Tweaks for HTML validation<br>\n - Filter - &#34;Unique lines&#34; could possibly crash if history was empty or cleared on the disk<br>\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers<br>\n - Removing deprecated docker-compose.yml version attribute (#2967)<br>\n - Update settings.html<br>\n - Browser Steps - Increasing timeout for actions and unifying timeout values<br>\n - Browser Steps - Fixing &#39;Uncheck checkbox&#39; #2958<br>\n - UI - &#34;Browser Steps&#34; tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)<br>\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)<br>\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)<br>\n<br>\n - 0.49.1<br>\n - Update stock-not-in-stock.js - Italian (#2948)<br>\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `&#34;Exception: No parsable JSON found in this document&#34; ` error) (#2947)<br>\n - Add major and minor tags for Docker release workflow (#2938)<br>\n - Adding jinja2/browsersteps test (#2915)<br>\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)<br>\n<br>\n - 0.49.00<br>\n - Update README.md<br>\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)<br>\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don&#39;t show an error was detected)(#2897)<br>\n<br>\n - 0.48.06<br>\n - Restock -&nbsp;&nbsp;Add test for new lower/higher price notification Re #2715 (#2892)<br>\n - Update integration test for &#34;linuxserver&#34; test build (#2891)<br>\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL&#39;s being double-encoded, fixes chantify:// notifications (#2868) (#2875)&nbsp;&nbsp;(#2870)<br>\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)<br>\n - &#34;Send test notification&#34; button - Easier to understand test send results, Improved error handling, code refactor (#2888)<br>\n - Improve `last_checked` vs `last_changed` time information precision (#2883)<br>\n - Update Apprise to 1.9.1 (#2876)<br>\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)<br>\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)<br>\n<br>\n - 0.48.05<br>\n - Fixing test for CVE-2024-56509 (#2864)<br>\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )<br>\n<br>\n - 0.48.04<br>\n - Windows was sometimes missing timezone data (#2845 #2826)<br>\n<br>\n - 0.48.03<br>\n - 0.48.02<br>\n - 0.48.02<br>\n - Notifications - &#34;Send test&#34; was not always following &#34;System default notification format&#34; (#2844)<br>\n - Notifications - &#34;Send test&#34; was not always following &#34;System default notification format&#34;<br>\n<br>\n - 0.48.02<br>\n - Notifications - &#34;Send test&#34; was not always following &#34;System default notification format&#34;<br>\n - Notifications - Default notification format (for new installs) now &#34;HTML color&#34; (#2843)<br>\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )<br>\n - Notifcations - Adding &#34;HTML Color&#34; notification format option (#2837)<br>\n - UI - Make &#39;tag&#39; sticky - redirect to current tag on edit or add watch (#2824 #2785)<br>\n - Notifications - Support for commented out notification URLs (#2825 #2769)<br>\n - Docs - Adding information to README.md about the new scheduler<br>\n<br>\n - 0.48.01<br>\n - UI - Fixing scheduler options<br>\n<br>\n - 0.48.00<br>\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)<br>\n - New functionality - Time (weekday + time) scheduler / duration (#2802)<br>\n - Add Turkish phrases for out-of-stock detection (#2809)<br>\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)<br>\n - Update stock-not-in-stock.js<br>\n - Python 3.13 compatibility (#2791)<br>\n - Code - Update .gitignore and .dockerignore (#2797)<br>\n - VisualSelector - Use &#39;deflate&#39; for storing elements.json, 90% file size reduction (#2794)<br>\n - UI - Show local timezone info in settings (for future functionality) #2793<br>\n - Notification - Locking paho-mqtt:// version fix<br>\n - Update COMMERCIAL_LICENCE.md<br>\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)<br>\n - Minor improvement for queue management<br>\n - Update bug_report.md<br>\n<br>\n - Security - Fix test<br>\n - Security check - improve test<br>\n - 0.47.06<br>\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set<br>\n - Update docker-compose.yml (#2767)<br>\n - Price tracker - fix for sites that supply an empty additional price (#2758)<br>\n - Testing - Pinning werkzeug (#2757)<br>\n<br>\n - 0.47.05<br>\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright<br>\n - Backups - Hide incomplete/running backups from being downloaded<br>\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)<br>\n - Filters - Process all CSS and XPath &#39;subtract&#39; selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)<br>\n<br>\n - 0.47.04<br>\n - Do not recheck &#39;paused&#39; watches on edit/save (Re #2747 #2750)<br>\n - Notification post:// get:// etc - Fixing URL encoding of headers so that &#39;+&#39; in URL is correctly parsed as &#39; &#39; (and other url-encodings) (#2745)<br>\n - #2502 - Add jinja2 template handling to request body and headers (#2740)<br>\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)<br>\n - &#34;Send test notification&#34; in &#34;Restock&#34; mode was not working correclty when restock tokens &#34;{{restock.price}}&#34; were in the notification body (#2737)<br>\n - #2727 Notifications - Fix &#34;send test notification&#34; on empty list, includes test (#2731)<br>\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)<br>\n - Filters - &#34;Block change detection when text exists&#34; should not trigger a change when the original text returns<br>\n - UI - More work on tab buttons hiding behind menu/header&nbsp;&nbsp;:-)<br>\n<br>\n - 0.47.03<br>\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)<br>\n - UI - Fix scroll offset / tab buttons hiding behind menu/header<br>\n - 0.47.02<br>\n - UI - Fix scroll offset / tab buttons hiding behind menu/header<br>\n<br>\n - 0.47.02<br>\n - UI - Fix scroll offset / tab buttons hiding behind menu/header<br>\n<br>\n - 0.47.01<br>\n - Adding missing `apprise_plugin` for pypi/pip based installs<br>\n<br>\n - 0.47.00<br>\n - Restock multiprice improvements (#2698)<br>\n - Test - Simple test for live preview<br>\n - Adding test for proxy checker/scanner (#2697)<br>\n - Fixing proxy checker (#2696)<br>\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)<br>\n - Testing - Tidyup (#2693)<br>\n - Filters &amp;amp; Text - Preview refactor/improvements (#2689)<br>\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)<br>\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header<br>\n - UI - Filters live preview - improvements to layout<br>\n - Restock - Use the scraped &#39;Not in stock&#39; product status over the metadata version (many website lie in the metadata) (#2684)<br>\n - UI - Better 40x error message (#2685)<br>\n - Visual Selector - Including &amp;lt;button&amp;gt; (#2686)<br>\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)<br>\n - Code - Small improvements in logging<br>\n - UI - CSS - Fix on sorting row wrapping issue (#2680)<br>\n - UI - Live filters preview - Better handling of watch preferences<br>\n - UI - &#34;Diff&#34; button in overview list is now &#34;History&#34; button (#2679)<br>\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)<br>\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters<br>\n - UI - Live filters preview - dark mode improvements<br>\n - UI - Improvements to text preview on mobile<br>\n - UI - Improvements to live preview of Filters text<br>\n - UI - Misc fixes for mobile styling (#2669)<br>\n - Update docker-compose.yml - Adding example for enabling change detection on local files<br>\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)<br>\n - UI - &#34;Filters &amp;amp; Triggers&#34; - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)<br>\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)<br>\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)<br>\n - Restock monitor - Only try to process restock information (like scraping for &#34;out of stock&#34; keywords) if the page was actually rendered correctly. (#2645)<br>\n - Text filters - Adding filters &#34;Trim whitespace&#34; and &#34;Remove duplicate lines&#34;<br>\n - Browser Steps - UI - Use a better flexbox layout<br>\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)<br>\n - Update AppRise notification library to 1.9.0 (#2624)<br>\n - browser_steps: add &#34;click element containing text if exists&#34; (#2629)<br>\n - Testing - Fixing Restock test #2641<br>\n - Testing - Fix false filter missing check alerts<br>\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)<br>\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)<br>\n - Small memory allocation fixes (#2625)<br>\n - Testing - locale fix for test (#2623)<br>\n - Testing/Code - Improving test reliability (#2617)<br>\n - UI - Hiding noisy info under &#39;show advanced help&#39; button (#2609)<br>\n<br>\n - 0.46.04<br>\n - Fixing restock monitor tests and tweaking docker default config example,<br>\n - Container name should be &#39;sockpuppetbrowser&#39; because its not just playwright that uses it<br>\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)<br>\n - Restock - updating texts and text offsets<br>\n - Build - Unpin jsonschema for faster builds (#2583)<br>\n - Price detection/scraping - Adding extra element training data (#2582)<br>\n<br>\n - 0.46.03<br>\n - Watch &#39;Download last snapshot&#39; link/button should give last, not first snapshot (#2576)<br>\n - Price and restock scraping - small price fix scraper (#2575)<br>\n - Browser Steps UI - Interactive UI wasn&#39;t sending headers but was when the check ran&nbsp;&nbsp;(#2551)<br>\n - Set encoding type for scraper script reader (#2574 #2568)<br>\n - Handle zero-byte/empty content responses with &#34;`[ ] Empty pages are a change`&#34; option, the same as when the HTML doesnt render any useful text (#2530)<br>\n<br>\n - 0.46.02<br>\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)<br>\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00c3\u00a9t\u00c3\u00a9 Fran\u00c3\u00a7aise du Radiot\u00c3\u00a9l\u00c3\u00a9phone (SFR) Support (#2524)<br>\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)<br>\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)<br>\n - Use #!/usr/bin/env to support virtualenv (#2518)<br>\n - Update README.md<br>\n - UI - Adding &#34;Download latest HTML snapshot&#34; from Edit Watch &amp;gt; Stats page for easier debugging (#2513)<br>\n<br>\n - 0.46.01<br>\n - UI - Fixing up &#39;test notification&#39; bug from main settings and tag settings pages #2510 (#2511)<br>\n<br>\n - 0.46.00<br>\n - Restock/Price detection - Improving text information snapshot value<br>\n - Restock - Tweaking storage of &#34;original price&#34;<br>\n - Fixing file:// file pickup&nbsp;&nbsp;- for change detection of local files (#2505)<br>\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)<br>\n - Dropping older ARM v6 support due to dependencies not having support (#2506)<br>\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)<br>\n - Restock &amp;amp; Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits<br>\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings<br>\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)<br>\n - UI - Restock/price following text cleanups<br>\n - UI - Extract &amp;lt;title&amp;gt; as title should work on all processors (#2490)<br>\n - Restock &amp;amp; Price monitor -&nbsp;&nbsp;Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list<br>\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)<br>\n - Update COMMERCIAL_LICENCE.md<br>\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software<br>\n - Adding COMMERCIAL_LICENCE.md<br>\n - Testing - Adding simple memory usage test (#2483)<br>\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)<br>\n<br>\n - 0.45.26<br>\n - Code - Fixing deprecation warning (#2477)<br>\n - UI - Visual Selector should still update when elements were not found (#2476)<br>\n - Code - Update/modernise diff.py (#2471)<br>\n - UI - Visual Selector - Multiple selections (refactor) (#2475)<br>\n - UI - Visual Selector now supports Shift+Click for multiple selections!<br>\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in &#34;CSS/JSONPath/JQ/XPath Filters&#34; include filters (#2440)<br>\n - UI - Visual Selector graphics should be centred<br>\n -&nbsp;&nbsp;Snapshot count from history was not updated in watch after using [clear history] (#2459)<br>\n - Fixing &#39;tags&#39;&#39; field from old installs (0.43.0+) could have wrong data-type causing crash<br>\n<br>\n - 0.45.25<br>\n - UI - Fixing preview/diff &#34;ignore text&#34; highlight button (refactor, didnt work in &#34;preview&#34; mode) (#2455)<br>\n - Restock detection - Updating detection texts<br>\n - UI - Mobile - Hiding empty columns<br>\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly<br>\n - Update docker-compose.yml - fix indentation re #2447<br>\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)<br>\n - Restock detection - updating texts<br>\n - UI - Fixing double punctuation in &#39;unpaused&#39; message #2435<br>\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)<br>\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)<br>\n - Filters - Implement jqraw: filter&nbsp;&nbsp;(use this to output nicer JSON format when selecting/filtering by JSON) (#2430)<br>\n - Build - fixing build warnings<br>\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt &#34;wheels&#34; for rPi devices, upgrade cryptography security library<br>\n - Prefer pythons built in &#34;importlib&#34; over pkg_resources+setuptools (#2424)<br>\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)<br>\n<br>\n - 0.45.24<br>\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)<br>\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on &#39;save&#39; (#2413)<br>\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)<br>\n - Improve testing for Python 3.10, 3.11 and 3.12<br>\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393<br>\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)<br>\n - Fetching/Requests - Fixing&nbsp;&nbsp;user agent header overrides per-watch of global settings (#2409)<br>\n - Code - improving unique key fix for history database handler (#2402)<br>\n - UI - &#39;Mark all viewed&#39; button should not show when all viewed (#2399)<br>\n - Fixing build test - Adding small delay (#2397)<br>\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)<br>\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393<br>\n - UI - Preview single snapshot - Date and button fixes (#2389)<br>\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)<br>\n<br>\n - 0.45.23<br>\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)<br>\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)<br>\n - Fix overflowing text<br>\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)<br>\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)<br>\n - Testing - Fixing JSON test<br>\n - UI - Mobile - quick watch form element fixes<br>\n - UI - CSS - Remove gradient border, it did not add much to the design #2377<br>\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)<br>\n - Notifications -&nbsp;&nbsp;Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)<br>\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)<br>\n - Browser Steps - Fixing &#34;goto site&#34; step #2330 #2337 (#2364)<br>\n - Crash on older CPU -&nbsp;&nbsp;Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )<br>\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint<br>\n - UI - Refactor of the Recheck Time Settings, Added &#34;Use default recheck time&#34; checkbox and refactor/simplify system handling (#2362)<br>\n - UI - Search should scan/search error messages (#2353)<br>\n - UI - &#39;stats&#39; tab should show what the server-type detected is ( #2348 )<br>\n - Update README.md<br>\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)<br>\n<br>\n - 0.45.22<br>\n<br>\n - 0.45.21<br>\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags<br>\n - UI - Error text on exception should contain the word Exception (#2322)<br>\n<br>\n - 0.45.20<br>\n - Bug fix - further work on&nbsp;&nbsp;lxml filter extract (#2313 #2312 #2317)<br>\n<br>\n - 0.45.19<br>\n - Bug fix for newer lxml module - module &#39;lxml.etree&#39; has no attribute &#39;_ElementStringResult&#39; - reimplement _ElementStringResult (#2313 #2312)<br>\n<br>\n - 0.45.18<br>\n - UI - Adding UI notice if watch has group options set (#2311 #2307)<br>\n - dependabot - automatically follow apprise<br>\n - &#34;Send Test Notification&#34; - In &#34;Group&#34; settings form it should not fallback to the system wide notifications when sending a test if nothing is set.<br>\n - &#34;Send Test Notification&#34; - Now provides better feedback and works with the actual values in system settings form<br>\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)<br>\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243<br>\n - UI - Remove unique check for URLs entered on the &#34;quick watch add&#34; form ( #2286 #2292 )<br>\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)<br>\n - &#34;Send Test Notification&#34; button&nbsp;&nbsp;from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )<br>\n<br>\n - 0.45.17<br>\n - UI - Add helper note<br>\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters<br>\n - Update contributing documentation for discontinuation of `dev` branch (#2272)<br>\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)<br>\n - Notifications - Updating apprise version, pinning&nbsp;&nbsp;mqtt:// to compatible version (#2242)<br>\n<br>\n - 0.45.16<br>\n - Pip build - content fetchers package was missing<br>\n<br>\n - 0.45.15<br>\n - Updating restock detection texts<br>\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)<br>\n - UI - Overview list shortcut button - Ability to reset any previous errors<br>\n - Chrome Extension - Adding link and install information from the API page<br>\n - Chrome Extension - Adding link in README.md to the webstore<br>\n - Chrome Extension - Adding callout to UI<br>\n - Import - Fixed &#34;Include filters&#34; option (fixed typo on select) (#2232)<br>\n - Updating restock detection texts<br>\n - Restock detection - Improving test for restock IN STOCK -&amp;gt; OUT OF STOCK (#2219)<br>\n - Puppeteer - remove debug hook<br>\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )<br>\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)<br>\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible<br>\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper<br>\n - Fetching - Puppeteer - Adding more debug/diagnostic information<br>\n - Update stock-not-in-stock.js<br>\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)<br>\n - Code - Remove whitespaces in visual selector elements config<br>\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)<br>\n - Update stock-not-in-stock.js<br>\n - Fetching pages - Custom browser endpoints should not have default proxy info added<br>\n - Puppeteer - fixing wait times<br>\n - Puppeteer - more improvements to proxy and authentication<br>\n - Puppeteer - client fixes for proxy and caching (#2181)<br>\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)<br>\n - Puppeteer fetch - fixing exception names<br>\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)<br>\n - Alpine linux build - adding JPEG development headers to fix build errors<br>\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)<br>\n - Fetching - Prefer to use SockPuppetBrowser (#2163)<br>\n<br>\n - 0.45.14<br>\n - Bug fix -&nbsp;&nbsp;fix missing default var (#2162/ #2118/ #2122 )<br>\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)<br>\n - Restock detection - Update stock-not-in-stock.js (NL)<br>\n - New text filter - Sort text alphabetically filter (#2153)<br>\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)<br>\n - Record notification count and show in [stats] tab (#2150)<br>\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)<br>\n - UI - Show error/warning when trying to compare the same version<br>\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)<br>\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565<br>\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)<br>\n - Testing - General test workflow improvements (#2144)<br>\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)<br>\n - Notifications - skip empty notification URLs from being processed (#2138)<br>\n - UI - Filters &amp;amp; Triggers - Adding example for keyword matching in a line<br>\n - RSS - Adding performance stats<br>\n - Notification - logging - adding performance information for processing time of notifications #327<br>\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)<br>\n - Logging - Adding extra debug logging to change detection (#2136)<br>\n - Fetcher -&nbsp;&nbsp;Improve status_code logging (#2130 #2122)<br>\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)<br>\n - Restock tweaks - use a single regex, tidy up height detection (#2125)<br>\n - Notification - Templates - Adding an example of how to use URL encoding with tokens<br>\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads<br>\n - Build maintenance&nbsp;&nbsp;- dependabot - Bump the all build helpers (#2121)<br>\n - Enable dependabot for github-actions (#2119)<br>\n - Update docker-compose.yml<br>\n<br>\n - 0.45.13<br>\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/&amp;lt;uuid&amp;gt;/history` @rozpuszczalny<br>\n - Test - tidy up backup test (#2117)<br>\n - Adding contributors section (#2116)<br>\n - Logging loguru output tweaks (#2112)<br>\n - Support Loguru as a logger (#2036)<br>\n - Update stock-not-in-stock.js texts<br>\n - Test - Adding extra test for HTML output in emails ( #2103 )<br>\n - Update README.md<br>\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)<br>\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)<br>\n - Browser Steps - Fixing &#34;&#39;Response&#39; object is not subscriptable&#34; where quotes were used in connection URL&nbsp;&nbsp; - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)<br>\n - Added OPTIONS HTTP method (#2094)<br>\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)<br>\n<br>\n - 0.45.12<br>\n - 0.45.11<br>\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)<br>\n - Update README.md<br>\n - Removing heroku support as its no longer free<br>\n - PyPi package build fixes (#2084)<br>\n - Adding PyPi pip package publisher script<br>\n<br>\n - 0.45.10<br>\n - Update README.md - Remove deprecated docker-compose (now docker compose)<br>\n - Browser Steps - General error handling improvements (#2083)<br>\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)<br>\n - UI - [Send test notification] - Refactor to use all tokens&nbsp;&nbsp;like a real watch and Notification Body+Title from UI value (#2079)<br>\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support.&nbsp;&nbsp;(#2075)<br>\n - Restock detection - &#34;In stock&#34; should be None/&#34;Not yet checked&#34; by default (#2069)<br>\n - Restock detection - updating texts<br>\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don&#39;t switch to custom puppeteer mode if external browser URL is active (#2068)<br>\n<br>\n - 0.45.9<br>\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)<br>\n - Testing: Improve application signal handling test coverage (#2052)<br>\n - Update docker-compose.yml<br>\n - Restock detection - Update stock-not-in-stock.js strings (#2032)<br>\n - API - Updating documentation<br>\n - Update README.md<br>\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)<br>\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)<br>\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)<br>\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser<br>\n<br>\n - 0.45.8.1<br>\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)<br>\n - UI - Fix - Edit Watch &#39;Show advanced options&#39; should fire at page load to show you whats possible<br>\n<br>\n - 0.45.8<br>\n - Restock detector - adding more detection strings<br>\n - UI - remove incorrect label<br>\n - UI - &#34;Add new watch&#34; URL at main input box should always grow to match the viewport<br>\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)<br>\n - UI - &#39;Request body&#39; section disappears after switching from &#39;Playwright&#39; to &#39;System settings default&#39; and back on &#39;Request&#39; tab - Fixed #1449<br>\n - Browser Steps - Adding validation for &#34;Click X,Y&#34; step<br>\n - API - Make sure the watch &#34;is viewed&#34; attribute is correctly represented in the API output (#2009)<br>\n - Update playwright fetcher library and API calls<br>\n - Testing - Improve PDF text change detection tests (#1992)<br>\n - UI - Clicking the &#34;[Diff]&#34; link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)<br>\n - Visual Selector - xPath handling misc fixes (#1976)<br>\n - Fix build issue<br>\n - feature: Support XPath2.0 to 3.1 (#1774)<br>\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using &#34;scraping browsers&#34;/&nbsp;&nbsp;etc) (#1943)<br>\n - API/UI - Button to regenerate API key (#1975 / #1967)<br>\n - Code refactor for fetchers (#1941)<br>\n<br>\n - 0.45.7.3<br>\n - Build - update docker container cache setup<br>\n<br>\n - 0.45.7.2<br>\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)<br>\n - Revert &#34;Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)&#34; (#1964)<br>\n<br>\n - 0.45.7.1<br>\n - Build: python libraries - pinning more libraries (#1962)<br>\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)<br>\n - Pip builder - ignore proxy test data if it exists<br>\n<br>\n - 0.45.7<br>\n - UI - Fixing issue where search box JS interfered with page render when logged out<br>\n<br>\n - 0.45.6<br>\n - UI - Adding support-us widget &amp;lt;3 (#1956)<br>\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)<br>\n - Update README.md - Adding import information<br>\n - Upgrade playwright browser library (#1942)<br>\n - Update docker-compose.yml - playwright version should be the same as in the automated tests<br>\n - Import - Improved Wachete Excel XLS import support for &#34;dynamic wachet&#34; (sets correct state of using chrome browser or not) column (#1934)<br>\n - Refactor Excel / wachete import, extend tests (#1931)<br>\n - Build - Upgrading pip packages (#1915)<br>\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)<br>\n - Docker build - upgrade image to &#34;bookworm&#34; debian version - fix glibc mismatch (#1918)<br>\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)<br>\n - Nice format stats (comma sep)<br>\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)<br>\n<br>\n - 0.45.5<br>\n - BrowserSteps - Wrong text taken from browser steps&nbsp;&nbsp;(#1911)<br>\n<br>\n - 0.45.4<br>\n - Code cleanup - Browser Steps<br>\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)<br>\n - Text Filters - &#34;Extract Text&#34; filter was not being error checked properly when using a RegEx (#1902)<br>\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)<br>\n - UI - &#34;With errors&#34; tag/button should always show the current tag error count<br>\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)<br>\n - Upgrade selenium to 4.14.0 (latest) (#1783)<br>\n - UI - Don&#39;t show search icon when logged out (#1896)<br>\n - UI - Adding handy &#34;limit to watches with errors&#34; button (#1886)<br>\n - UI - Viewing text differences - Tweaks to &#34;Jump to next change&#34; button<br>\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)<br>\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)<br>\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868<br>\n - UI - Adding [stats] tab to watch Edit page (#1880)<br>\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)<br>\n - RSS fetch - RSS field &amp;lt;title&amp;gt; was not rendering as text correctly, added workaround #1879<br>\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)<br>\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)<br>\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)<br>\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860<br>\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style<br>\n - Testing - Improve xPath tests (#1863)<br>\n - UI - Fixing jump to next difference button after refactor<br>\n - UI - Updating proxy tip link<br>\n - UI - Adding watch label/title to [edit] page title (#1858)<br>\n - Documentation - Add note that playwright is not supported on ARM type devices #1856<br>\n - UI - Difference page - added &#39;title&#39; to each change for nice mouse-over information about when the change occured<br>\n - UI - Difference page - Tweak &#39;preview&#39; page invite text<br>\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)<br>\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find<br>\n - System - No need to run updates on fresh installs (#1854)<br>\n - UI - Proxy configuration helper notes improvements<br>\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)<br>\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies<br>\n<br>\n - 0.45.3<br>\n - Update README-pip.md<br>\n - Update README.md<br>\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)<br>\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)<br>\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)<br>\n - Update README.md<br>\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser<br>\n - BrowserSteps - &amp;lt;input&amp;gt; of type &#39;number&#39; should use &#39;enter text in field&#39;<br>\n - Restock detect - bumping texts for restock detection<br>\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image<br>\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)<br>\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)<br>\n - Building application - Upgrade test workflows to latest versions (#1817)<br>\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)<br>\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)<br>\n - UI - More precise text to describe &#34;current_snapshot&#34; notification token<br>\n<br>\n - 0.45.2<br>\n - Code/Test - Improve testing for creating backups<br>\n - UI - Re-order notification field settings<br>\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link<br>\n - UI - Notifications - Tweak discord help text<br>\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)<br>\n - UI - &#34;recheck all&#34; button should ignore blank/empty &#34;tag&#34; setting when set<br>\n - Update README.md<br>\n - UI - Fix spelling error<br>\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)<br>\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)<br>\n - Ability to select &#34;No proxy&#34; for a watch when you have proxy&#39;s configured<br>\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)<br>\n - Update README.md<br>\n - UI - Fixing update for sort by &#34;date created&#34; or &#34;#&#34; in watch overview table ( #1775 )<br>\n - Add &#39;diff_patch&#39; notification body token - This will allow the diff to be generated in the &#34;unified patch format.&#34; (#1765)<br>\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)<br>\n<br>\n - 0.45.1<br>\n - UI - Fixing open/broken HTML which was causing some buttons to not display<br>\n<br>\n - 0.45<br>\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)<br>\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)<br>\n - Fix - Regular Expression text in&nbsp;&nbsp;`ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)<br>\n - Fix typo in README.md (#1759)<br>\n - UI - &#34;Test notification&#34; button in &#34;Group Tag&#34; settings page was broken due to missing variable #1753<br>\n - UI - Clicking &#39;ignore text&#39; when highlighting text should clear the preview text button/area. #1754<br>\n - Update documentation - How to set number of concurrent fetchers<br>\n<br>\n - 0.44.2<br>\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)<br>\n - Update README.md<br>\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)<br>\n - Updating in app links<br>\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like &#34;localhost&#34; with BLOCK_SIMPLEHOSTS setting (#1732)<br>\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)<br>\n<br>\n - 0.44.1<br>\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)<br>\n - UI - Fixing darkmode switch icon<br>\n<br>\n - 0.44<br>\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.<br>\n - API - Updating API description for handling a single watch<br>\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems<br>\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)<br>\n - Browser Steps - When cleaning up old screenshots, check the file exists<br>\n - Scan/Recheck proxies - Report filter not found as &#34;OK&#34; but with warning<br>\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)<br>\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)<br>\n<br>\n - 0.43.2<br>\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)<br>\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)<br>\n<br>\n - 0.43.1<br>\n - Bug fix - Notification settings were not cascading from global -&amp;gt; tags -&amp;gt; watch correctly in some cases (#1654)<br>\n - Bug - Fix watch clone (#1647)<br>\n - UI - Dont allow empty tag names (#1641)<br>\n<br>\n - 0.43<br>\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox<br>\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups<br>\n - UI - Fixes to dark mode toggle (#1629)<br>\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)<br>\n - Code - Adding CI test for search (#1626)<br>\n<br>\n - 0.42.3<br>\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)<br>\n - README - Update links to new website<br>\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)<br>\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)<br>\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)<br>\n - UI/Fetching - Update &#34;Filter not found&#34; message to be more explanatory/helpful (#1602)<br>\n - Restock monitor - Updating texts for tickets available/unavailable restock detection<br>\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)<br>\n<br>\n - 0.42.2<br>\n - UI - Configurable pager size #1599 #1598<br>\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 )<br>\n - Restock detection - Better reporting when it fails (#1584)<br>\n - Fetcher - Puppeteer experimental fetcher wasn&#39;t returning the status-code (#1585)<br>\n - Update README.md<br>\n<br>\n - 0.42.1<br>\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)<br>\n<br>\n - 0.42<br>\n - UI - &#34;Search List&#34; also works for &#39;Title&#39; field<br>\n - UI - New &#34;Search List&#34; icon and functionality (#1580)<br>\n - VisualSelector - Add message when first version cannot be found<br>\n - UI - update link to official project page<br>\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)<br>\n - BrowserSteps - Support for float seconds (0.5 etc)<br>\n - BrowserSteps - Session keep alive timer countdown fix<br>\n - BrowserSteps - adding setup check<br>\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors<br>\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a &amp;lt;div&amp;gt; or other<br>\n - Fetcher - Experimental fetcher - dont cache embedded data URLs<br>\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)<br>\n - BrowserSteps - Include nice big start button SVG<br>\n - BrowserSteps - Remove unreliable method for detecting if the element has a &#34;click&#34; listener and default to click (switch to &#39;Click X,Y&#39; will return the right co-ords anyway)<br>\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)<br>\n - UI - Adding shortcut list select button for &#34;clear/reset history&#34;<br>\n - Fetcher - Experimental fetcher fixes, now only enabled with &#39;USE_EXPERIMENTAL_PUPPETEER_FETCH&#39; env var (default off) (#1561)<br>\n - UI - Adding shortcut list select button for &#34;clear/reset history&#34;<br>\n - Element scraper - wrap offset detection in try/catch<br>\n - BrowserSteps - BrowserSteps was not always following proxy information<br>\n - BrowserSteps - remove minor delay<br>\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)<br>\n - UI - Fix back navigation / browser history (#1556)<br>\n - UI - HTML validation improvements for edit forms (#1553)<br>\n - UI - Various minor HTML validation fixes<br>\n - UI - pagination - use count including tag filter for pagination display<br>\n - UI - Notifications - Adding icon to &#34;Add Email&#34; button<br>\n - UI - Adding pagination to watch list (#1549)<br>\n - UI - Set selected watches as &#39;viewed&#39; (#1550)<br>\n - UI - Fix missing &amp;lt;/span&amp;gt; in watch list when using restock detection<br>\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)<br>\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)<br>\n - Adding generic changedetection.io SVG icon #1527<br>\n - Tests - error test - be sure to clear results from other test parts<br>\n - Update README.md<br>\n - Tests - Add test to check that low level fetch errors are cleared on next check<br>\n - Restock alerts - adding extra detection texts<br>\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)<br>\n - Automated CI test for ensuring pypi package was built correctly (#1488)<br>\n<br>\n - GitHub container build - &#39;provenance&#39; was disabled<br>\n - 0.41.1<br>\n - Fix for pip installations<br>\n<br>\n - 0.41<br>\n - Notifications - Include triggered text token as&nbsp;&nbsp;`{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)<br>\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also<br>\n - Quick add form - adjust font size and rename stock recheck<br>\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)<br>\n - Restock / stock / out of stock monitor - bumping detection texts<br>\n - Use brotli for reducing the size of the text snapshots (#1482)<br>\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)<br>\n - New feature - Restock / stock / out of stock monitor option/mode<br>\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.<br>\n - Update README.md<br>\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)<br>\n - BrowserSteps - Adding `Goto URL` step<br>\n - Fixing bad linebreak definition `&amp;lt;/br&amp;gt;` in notifications and UI (#1465)<br>\n - Notification Improvements - New tokens `{{diff_added}}` and&nbsp;&nbsp;`{{diff_removed}}`, removed whitespace around `added` and `into`&nbsp;&nbsp;( Issue #905 ) (#1454)<br>\n - Update README.md<br>\n<br>\n - Bug - False change alerts - code cleanups Re #962 (#1444)<br>\n - Update README.md<br>\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)<br>\n - False change alerts fix - Don&#39;t reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)<br>\n - Library update - Replace bs4 with beautifulsoup4 (#1433)<br>\n - API - Including `last_changed` timestamp in watch API info (#1436)<br>\n - Update apprise to 1.3.0 (#1430)<br>\n - API documentation - improving example for list watches<br>\n - API documentation - improving example for snapshot history<br>\n - API - Adding current version to &#39;System Information&#39; endpoint, bumping API docs, Re #1429<br>\n - Further improving API documentation Re #1426<br>\n - Improving API documentation Re #1426<br>\n - Browser Steps - Adding &#34;Wait for text&#34; and &#34;Wait for text in element&#34; Re #1427<br>\n - Re #1382 - UI fix - sorting now works with selected tag<br>\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)<br>\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same&nbsp;&nbsp;(#1410)<br>\n - Deleting a watch now removes the entire watch storage directory (#1408)<br>\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)<br>\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393<br>\n - Remove unused code (#1394)<br>\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot<br>\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389<br>\n<br>\n - 0.40.2<br>\n - Code cleanup - remove unused import<br>\n - UI fix - Fix logic for showing screenshot on diff page (#1379)<br>\n - Re #1365 - Playwright - Browser &#34;Service Workers&#34; should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)<br>\n - New setting to allow passwordless access to your &#39;diff&#39; page - perfect for sharing your diff page securely, refactored login code (#1357)<br>\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)<br>\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)<br>\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)<br>\n - Fix fetch UI default fetch backend option icon (#1343)<br>\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)<br>\n<br>\n - 0.40.1.1<br>\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)<br>\n<br>\n - 0.40.1.0<br>\n - Update README.md<br>\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079<br>\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)<br>\n - Ability for watch to use a more obvious system default fetcher (#1320)<br>\n - Update README.md<br>\n - pip - eventlet doesnt support dnspython &amp;gt;=2.3.0 (Fixes build error)<br>\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)<br>\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)<br>\n - Data storage - Don&#39;t recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)<br>\n - UI: Updating queued success message (#1285)<br>\n - README.md - Fix release link (#1277)<br>\n - Notifications: updating apprise (slack notification fixes and others) (#1272)<br>\n - Remove docker-compose version so it works on any modern version #1144 (#1268)<br>\n - Update the docker compose file to any version (#1079) (#1144)<br>\n - IPv6 support for listening on (#1267)<br>\n - Test improvements (#1264)<br>\n<br>\n - 0.40.0.4<br>\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)<br>\n - Filters &amp;amp; Notifications - fixed tokens in filter not found notification<br>\n - UI - Fix broken html tags in settings page<br>\n - Proxy Settings in UI - TidyUp BrightData text<br>\n - Ability to configure extra proxies via the UI (#1235)<br>\n - Docker container updates - use Python 3.10, remove unused packages<br>\n - Tidy up list icons a bit (#1250)<br>\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)<br>\n - Testing - Run test as fully built docker container (#1245)<br>\n - Dark mode - system setting var is not required (its cookie based)<br>\n<br>\n - 0.40.0.3<br>\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements<br>\n - Fetching - Check the most overdue watch first (#1242)<br>\n - Overview list - Checkbox action &#34;Recheck&#34;<br>\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)<br>\n - Fetching - Always sort the key order of JSON content for less false alerts&nbsp;&nbsp;(May cause an alert on upgrade, but will be better going forwards) #1219<br>\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder<br>\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)<br>\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers<br>\n - Improve ARM/rust build comment<br>\n - README.md - Improving JSONPath example for LD+JSON product data<br>\n<br>\n - 0.40.0.2<br>\n - Price follower - Dont scan for ldjson data when &#39;no&#39; was clicked on the suggestion (#1207)<br>\n - Adding missing parts for pip build Re #1206<br>\n<br>\n - 0.40.0<br>\n - VisualSelector - Exclude items that are not interactable or visible<br>\n - Automatically offer to track LD+JSON product price data (#1204)<br>\n - UI - favicon callback no longer needed<br>\n - Test cleanups (#1196)<br>\n - Update runtime.txt (#1198)<br>\n - Dark mode - HTML template tidy up (#1197)<br>\n - UI - watch tags also known as watch tag / label<br>\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly<br>\n - Extract data - minor improvement to example<br>\n - Darkmode - Pause/Mute notification colour fix, re #1195<br>\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)<br>\n - Notifications - tokens/jinja2 templating (#1184)<br>\n - Dark mode - more colour fixes<br>\n - Test improvement - improving notification error network test<br>\n - Extract text as CSV - Extra validation (#1192)<br>\n - Dark mode - make watch list easier to read when theres &#39;unviewed&#39; entries<br>\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)<br>\n - UI - Cursor over labels should be pointer<br>\n - Dark mode - Make watches with errors easier to read<br>\n - Dark mode - cookie path should be all site<br>\n - Tweaks - adding hover/title to dark mode button<br>\n - UI - Dark Mode (#1187)<br>\n - docker-compose - Add playwright/selenium container dependencies example (#1178)<br>\n - BrowserSteps - Can be shared by the watch share link<br>\n - UI - Make tabs hoverable<br>\n - Favicon multiplatform and path fix/update (#1176)<br>\n - BrowserSteps - Cleanup interface on shutdown<br>\n - BrowserSteps - More work on cleaner shutdowns of browser session<br>\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown<br>\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)<br>\n - BrowserSteps - Use correct mimetype for screenshot update<br>\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)<br>\n - BrowserSteps - Add &#39;Execute JS&#39; step<br>\n - BrowserSteps - Also try to find clickable div/spans<br>\n - Update README.md<br>\n - Update README.md<br>\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset<br>\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169<br>\n - Extra validation for URLs with template markup (#1166)<br>\n - Browser Steps - adding &#39;please wait&#39; text while loading<br>\n - Re #1163 psutil missing from pip requirements<br>\n - Update README.md<br>\n - Update README.md<br>\n - VisualSelector &amp;amp; BrowserSteps - Scraper improvements, remove duplicate code<br>\n - Bumping VisualSelector example animation<br>\n - Remove dupe xpath finder prep code<br>\n - Browsersteps &#39;Beta&#39; label image path fix<br>\n - Configurable &#34;Browser Steps&#34; when Playwright/Chrome is configured&nbsp;&nbsp;(enter text, scroll, wait for text, click button etc) (#478)<br>\n - Update README.md -&nbsp;&nbsp;Make docker instructions easier to follow on Windows&nbsp;&nbsp;(#1158)<br>\n<br>\n - 0.39.22.1<br>\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)<br>\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly<br>\n - Update README.md<br>\n - Update README.md<br>\n<br>\n - 0.39.22<br>\n - Fix dangling HTML tag from screenshot notification<br>\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot,&nbsp;&nbsp;(#1140)<br>\n - Minor test improvements<br>\n - Option to attach screenshot to notification (#1127)<br>\n - VisualFilter - check previously set filters were set before highlighting<br>\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.)<br>\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)<br>\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)<br>\n - Make link to notification debug log easier to find (#1130)<br>\n - Bump notification library (#1128)<br>\n - Re #1126 HIDE_REFERER setting had wrong default<br>\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use &#39;False&#39; (#1121)<br>\n - Stability fix related to the new watch check count (#1113)<br>\n - Use deepcopy to stop possible data corruption (#1108)<br>\n - Code- Use dict .get instead of key<br>\n - Adding a check counter to watch fetching (#1099)<br>\n - Update README.md<br>\n - HIDE_REFERER incompatible with password based login, added comment to code #996<br>\n - Update README.md<br>\n - Filters can now accept a list/multiple filters (#1064) #623<br>\n<br>\n - 0.39.21.1<br>\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)<br>\n<br>\n - 0.39.21<br>\n - Disable version check when pytest is running (#1084)<br>\n - Removing unused code (#1070)<br>\n - Docker &amp;amp; python - Jq conditional pip requirements.txt include (Don&#39;t install in Windows because theres no Windows library/wheel)<br>\n - Docker &amp;amp; python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)<br>\n - UI - Make fetch error more readable (#1038)<br>\n - Update README.md<br>\n - Re #1052 - Watch &#39;open&#39; link should use any dynamic/template info (#1063)<br>\n - Remove accidental files<br>\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation<br>\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)<br>\n - API - system info - allow 5 minutes grace before watch is considered &#39;overdue&#39;<br>\n - API - Adding basic system info/system state API (#1051)<br>\n - Build - Fix syntax in container build test (#1050)<br>\n - Building - Test container build on PR<br>\n - Testing - Use same version of playwright while running tests as in production builds (#1047)<br>\n - update path for validation in the CONTRIBUTING.md (#1046)<br>\n - History index safety check - Be sure that only valid history index lines are read (#1042)<br>\n - Option to Hide the Referer header from monitored websites. (#996)<br>\n<br>\n - 0.39.20.4<br>\n - Better cross platform file handling in diff and preview (#1034)<br>\n<br>\n - 0.39.20.3<br>\n - Windows - diff file handling improvements (#1031)<br>\n - Also include tests in pip build<br>\n - Update README.md<br>\n<br>\n - 0.39.20.2<br>\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)<br>\n - Adding test - Test the &#39;execute JS before changedetection&#39; (#1006)<br>\n<br>\n - 0.39.20.1<br>\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)<br>\n - Adding `make` to Dockerfile build as required by jq for ARM devices<br>\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)<br>\n<br>\n - 0.39.20<br>\n - Adds support for jq JSON path querying engine (#1001)<br>\n - Adding link to BrightData Proxy info (#1003)<br>\n - Remove quotationspage default watch<br>\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)<br>\n - Selenium fetcher - screenshot should be taken after &#39;wait&#39; time, not before #873<br>\n - Upgrade Playwright to 1.26<br>\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958<br>\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing &#34;Unable to retrieve content because the page is navigating and changing the content.&#34; on some sites<br>\n - Tidy up proxies.json logic, adding tests (#955)<br>\n - Update README.md - Include BrightData suggestion<br>\n - Improve Proxy minimum time debug output<br>\n - Default proxy settings fixes<br>\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)<br>\n - Upgrade Playwright to 1.25<br>\n - Update README.md<br>\n<br>\n - 0.39.19.1<br>\n - Notification - code tidyup<br>\n - Watch list &amp;amp; notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default<br>\n - Notification - Reset defaults button should be on edit page only<br>\n - Notification watch settings - add button to make watch use defaults (empties the settings)<br>\n - Notification system update - set watch to use defaults if it is the same as the default<br>\n - Fix typo (#924)<br>\n<br>\n - 0.39.19<br>\n - Update README.md<br>\n - Tweaks to python PIP readme<br>\n - Use play and pause separate icons (#919)<br>\n - Further notification settings refinement (#910)<br>\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)<br>\n - repair pip readme<br>\n - Test improvement - Visual selector data loads as JSON (#895)<br>\n - Cleaner separation of watch/global notification settings (#894)<br>\n - Code maintenance - Removing old function (#875)<br>\n - Show screenshot age in [preview]<br>\n - Update README.md<br>\n - Update README.md<br>\n - Update README.md<br>\n - Update bug_report.md<br>\n - Update bug_report.md<br>\n - Update README.md<br>\n<br>\n - 0.39.18<br>\n - More data saving pre-checks (#863)<br>\n - Update screenshot<br>\n - Checkbox operations - reorder buttons for safety<br>\n - UI feature - Basic checkbox/group operations (#861)<br>\n - Bug fix - automatically queued watch checks weren&#39;t always being processed sequentially<br>\n - Playwright - Support proxy auth mechanisms (#859)<br>\n - Update README.md<br>\n - Update README.md<br>\n - Skip processing when watch was deleted<br>\n - Playwright fetcher didn&#39;t report low level HTTP errors correctly (like Connection Refused) (#852)<br>\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)<br>\n - Visual selector data not being saved by refactor<br>\n - &#39;Save chrome screenshot&#39; checkbox never used, removing, we always save the screenshot. (#844)<br>\n - Crash fix: Data store sub-directories werent always being created when needed (#842)<br>\n - Make the table header easier to understand when sorting (#840)<br>\n - Column sorting (#838)<br>\n - Update README.md<br>\n - Revert &#34;don&#39;t process paused entries after queue&#34;, so we can still manually recheck a paused watch<br>\n - Remove &#39;last-changed&#39; from url-watches.json and always calculate from history index (#835)<br>\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies<br>\n - Execute JS should happen after waiting seconds<br>\n - Upgrade playwright python driver (#834)<br>\n - Crash protection - handle the case where watch was deleted while being checked (#833)<br>\n - Don&#39;t process a watch if it was paused after being queued (#825)<br>\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)<br>\n - Remove social links for now<br>\n<br>\n - 0.39.17.2<br>\n - Test fix - Remove debug from test<br>\n - Security update -&nbsp;&nbsp;Password could be unset from settings form unexpectedly (#808)<br>\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes<br>\n - Handle SIGTERM for cleaner shutdowns (#737)<br>\n - Remove [save &amp;amp; preview] button, the preview is not updated live so it can lead to confusion (#801)<br>\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)<br>\n - [preview current] cleanup code and add test<br>\n - Feature - mute notifications (#791)<br>\n - Test improvement - remove unnecessary step<br>\n<br>\n - 0.39.17.1<br>\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)<br>\n - README.md - new Discord invite link<br>\n<br>\n - 0.39.17<br>\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit<br>\n - UI Feature - Add watch in &#34;paused&#34; state, saving then unpauses (#779)<br>\n - Enhancement - support xPath text() function filter, for example &#34;//title/text()&#34; in RSS feeds (#778)<br>\n - Bug fix - Filter &#34;Only trigger when new lines appear&#34; should check all history, not only the first item (#777)<br>\n - Visual Selector direct element finder fix<br>\n - Update README.md<br>\n - Update README.md links<br>\n - Filter failure notification send default enable now controlled by setting Env var<br>\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)<br>\n - Update README.md - adding LinkedIn link<br>\n - Update README.md - Adding Discord and YouTube links<br>\n - Bug fix for alerting when xPath based filters are no longer present (#772)<br>\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)<br>\n - mailto plaintext handling fix for &#39;plaintext&#39; apprise integration<br>\n - Minor code cleanups<br>\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)<br>\n - Form text tweak - Regex clarification (#766)<br>\n - Update README.md<br>\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)<br>\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL<br>\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)<br>\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)<br>\n - remove extra file<br>\n - removing package-lock.json - not required to be in git<br>\n - Share-icon cleanups<br>\n - Test improvement: Extract text should return all matches<br>\n - Bug fix: RSS Feed should also announce utf-8 charset<br>\n - Regex extract filter: Return all regex results instead of first match (#730)<br>\n - Ability to specify JS before running change-detection (#744)<br>\n - Playwright - log console errors to output<br>\n - UI Improvement - Clarifying &#34;Visual Filter&#34; tool as &#34;Visual Selector Filter&#34;<br>\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)<br>\n - Update docker-compose.yml&nbsp;&nbsp;- Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)<br>\n<br>\n - 0.39.16<br>\n - Fix notification apprise application name to changedetection.io #731<br>\n - Update README.md<br>\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)<br>\n - Playwright - Use HTTP Request Headers override (Cookie, etc)<br>\n - lang: prefer &#39;clear (snap) history&#39; to &#39;scrub&#39; (#721)<br>\n - Minor diff page improvements - list should be sorted &#39;newest first&#39; and no need to include the current version to compare against (#716)<br>\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705<br>\n - Update README.md<br>\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)<br>\n - New filter - Block change-detection if text matches - for example, block change-detection while the text &#34;out of stock&#34; is on the page, know when the text is no longer on the page (#698)<br>\n - Docker containers - :latest is now stable release, :dev is now master/nightly<br>\n - Trigger filters improvement- it&#39;s possible some changes weren&#39;t getting detected because the previous checksum only recorded when an event occurred (#697)<br>\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured<br>\n - Notifications regression bug in 0.39.15 - only sent the first notification URL<br>\n - Playwright screenshots - no need for high-res &#34;bug workaround&#34; screenshot, use lower quality/faster configurable image quality env var<br>\n - Adding extra check when updating DB on ReplyWithContentButNoText<br>\n - Notifications log - log what was sent after applying all cleanups<br>\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram<br>\n - Give more helpful error message when a page doesnt load<br>\n - Tweaks to playwright fetch code - better timeout handling<br>\n - Re #580 - New functionality - Random &#34;jitter&#34; delay to requests (#681)<br>\n<br>\n - 0.39.15<br>\n - Watch overview list - adding spinner to make it easier to see whats currently being &#39;Checked&#39;<br>\n - Preview section - add helpful check<br>\n - Send test notification - improved handling of errors<br>\n - Notification log - also log normal requests and make the log easier to find<br>\n - Update bug_report.md<br>\n - Use correct RSS CDATA handling (#662)<br>\n - Improve logging (#671)<br>\n - New [scrub] button when editing a watch - scrub single watch history (#672)<br>\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)<br>\n - Diff + Preview - Fixing screenshot behaviour after preference change<br>\n - Screenshot handling on the diff/preview section refactor (#630)<br>\n - Shared watches - include &#34;Extract text&#34; filter<br>\n - Improve error message when filter not found in page result (#666)<br>\n - &#34;Extract text&#34; filter - improve placeholder example<br>\n - Visual selector - &#39;clear selection&#39; button should clear the filter also<br>\n - New feature - &#34;Extract text&#34; filter ability (#624)<br>\n - Fixing RSS feed HTML content formatting (#662)<br>\n - Update notification library - Improving telegram support<br>\n - &#39;Mark all viewed&#39; button was missing in this version, added test also. (#652)<br>\n - Content fetcher - Handle when a page doesnt load properly<br>\n - Playwright - Correctly close browser context/sessions on exceptions<br>\n - Move history data to a textfile, improves memory handling (#638)<br>\n - Update feature_request.md<br>\n - Remove UK Covid news<br>\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)<br>\n - Remove group tag arbitrary length limit (#645)<br>\n - Distill.io import bug fix when no tags assigned to a watch (#557)<br>\n - Ignore whitespace on by default<br>\n - Visual Selector - clear events when changing tabs<br>\n - Minor code cleanup<br>\n - Re #616 - content trigger - adding extra test (#620)<br>\n - README.md update Visual Selector tool - tidy up screenshots, improve text<br>\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads<br>\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML<br>\n - Update bug_report.md<br>\n - 0.39.14.1<br>\n<br>\n - 0.39.14.1<br>\n - pip build fix - include API module<br>\n - Visual Selector - be more resilient when sites interfere with the xPath scraping<br>\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)<br>\n<br>\n - 0.39.14<br>\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)<br>\n - API Interface (#617)<br>\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )<br>\n - Fixing edit template HTML<br>\n - Proxy settings on watch should have a &#34;[ ] default&#34; option (#610)<br>\n - Input field tidyup (#611)<br>\n - Update wiki link for &#39;More info&#39; about sharing a watch and its configuration<br>\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)<br>\n - Playwright - raise EmptyReply on empty reply, no need to process further<br>\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)<br>\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)<br>\n - Update PIP readme.md<br>\n<br>\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)<br>\n<br>\n - 0.39.13<br>\n - Distill.io JSON export file importer (#592)<br>\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)<br>\n - Improving Playwright docs (#588)<br>\n - Playwright - code fix<br>\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO<br>\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)<br>\n - Playwright fetcher - use the correct default User-Agent<br>\n - Toggle visibility of extra requests options/settings when not in use (#584)<br>\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative)&nbsp;&nbsp;(#489)<br>\n - Simplify scrub operation (simply cleans all) (#575)<br>\n - Bugfix - dont update record when deleted during check<br>\n - Improving support info in README.md<br>\n - Handle deletions better (#570)<br>\n - Data storage bug fix #569<br>\n - Upgrade notifications library - fixing marketup in email subject<br>\n - Ability to &#39;Share&#39; a watch by a generated link, this will include all filters and triggers - see Wiki (#563)<br>\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title<br>\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds<br>\n - Seconds/minutes/hours/days between checks form field upgrade from &#39;minutes&#39; only (#512)<br>\n - Form styling improvements<br>\n - Form field handling improvements - fixing field list handler for empty lines<br>\n - Fix &#34;Add email&#34; button in main global notification settings<br>\n - Test notification button fixed in main settings (#556)<br>\n - tgram:// be sure total notification size is always under their 4096 size limit<br>\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)<br>\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes<br>\n - Discord:// notification size limit - also includes the notification title<br>\n - Fix spelling errors<br>\n - Update README.md<br>\n - Update README.md<br>\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)<br>\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable<br>\n - Refactor form handling (#548)<br>\n - Adding support for change detection of HTML source-code via &#34;source:https://website.com&#34; prefix (#540)<br>\n - Re-label the quick-add widget placeholder &#39;tag&#39; to &#39;watch group&#39;<br>\n - HTTP Fetcher code improvements<br>\n - Adding RSS metadata auto-discovery<br>\n - Upgrade WTforms form handler to v3 (#523)<br>\n<br>\n - 0.39.12<br>\n - Miscellaneous settings form visual improvements (#535)<br>\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes<br>\n - Specify our Discord avatar_url as default avatar_url<br>\n - Minor git updates<br>\n - Fix screenshot tab name<br>\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)<br>\n - Make long reports in the notification error log easier to read<br>\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)<br>\n - Update README.md<br>\n - Skip processing a watch into the RSS feed if there&#39;s not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)<br>\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)<br>\n - Make text tab always available at default<br>\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)<br>\n - Remove &#39;unviewed&#39; status in watch table when Diff link clicked (#514)<br>\n - RSS feed CDATA should contain difference output<br>\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output<br>\n - Update README.md<br>\n - Update README.md<br>\n - Minor UI cleanups (mobile tabs, font sizing) (#503)<br>\n - Fix typo in Filters &amp;amp; Triggers settings. (#495)<br>\n - Add autofocus attribute to password login field (#496)<br>\n<br>\n - 0.39.11<br>\n - Microsoft Windows installation fixes (#492)<br>\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)<br>\n - GitHub tweak - build containers also on push to master<br>\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)<br>\n - Security update - Use CSRF token protection for forms, make &#34;remove password&#34; use HTTP Post (#484)<br>\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)<br>\n - Only build container on GitHub releases, not tests<br>\n - Also change container names to help stop some DNS issues<br>\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)<br>\n - Improving form/edit example markup<br>\n - JSON diff/preview should use utf-8 encoding where possible (#465)<br>\n - Fix typo in settings form<br>\n - Add python venv to .gitignore<br>\n<br>\n - 0.39.10<br>\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)<br>\n - Minor updates to filters form text<br>\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)<br>\n - Testing - Refactor HTTP Request Type test (#453)<br>\n - Make table header font size the same as content<br>\n - Adjust background colours<br>\n - Handle the case where the visitor is already logged-in and tries to login again (#447)<br>\n - Make the Request Override settings easier to understand<br>\n - Minor tweak to notification token table<br>\n - Style tweak to watch form<br>\n - Login form style fixes<br>\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)<br>\n - Remove pytest from production release pip requirements<br>\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory<br>\n - Re-arranging primary links so the important ones are easier to find on mobile<br>\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)<br>\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)<br>\n - Better text/plain detection and refactor tests (#443)<br>\n - Tweak support tabs and text (#440)<br>\n - Include link to changedetection.io hosted option (#439)<br>\n -&nbsp;&nbsp;Improved CPU usage around the loop responsible for what sites needs to be checked<br>\n - Update README.md with hosting options<br>\n<br>\n - 0.39.9<br>\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)<br>\n - &#34;Recheck&#34; button should work when entry is in paused state<br>\n - Better file exception handling on saving index JSON<br>\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test<br>\n - Ensure string matching on the ignore filter is always case-INsensitive<br>\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page<br>\n - Update README.md<br>\n - XPath RegularExpression support<br>\n - better checking of JSON type<br>\n - Make system level errors from the HTTP fetchers easier to find (#421)<br>\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)<br>\n - Dont allow redirect on login, it&#39;s safer and more reliable this way (#414)<br>\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int<br>\n<br>\n - 0.39.8<br>\n - Number of fetching workers can be overriden by Env &#34;FETCH_WORKERS&#34; (#413)<br>\n - Adding Env var &#34;WEBDRIVER_DELAY_BEFORE_CONTENT_READY&#34; to wait n seconds before extracting the text from the browser<br>\n - Language fix &#34;watches are rechecking.&#34; it actually puts them into an internal queue &#34;watches are QUEUED for rechecking&#34;<br>\n - Use flask url_for() for webdriver chrome icon instead of relative path<br>\n - Fix typo in the startup create-directory command suggestion (#405)<br>\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)<br>\n - Refactor tests for notification error log handler (#404)<br>\n - Notification error log handler (#403)<br>\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.<br>\n - fixed the reference to wiki for rpi section (#402)<br>\n - /preview format doesnt need &amp;lt;pre&amp;gt; - fixing too many returnlines in content on diff/preview page<br>\n - Update README.md<br>\n - Update README - Fix docker section<br>\n - Update README - Tidy up sections<br>\n - Offer instance on Lemonade Tidy README<br>\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)<br>\n - #323 Adding note about discord:// 2000 char limit (#392)<br>\n - plaintext mime type fix - Don&#39;t attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)<br>\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch<br>\n - Add option for tags on import (#377)<br>\n - Update CONTRIBUTING.md<br>\n - Update README.md<br>\n - Fix bug where diff and diff_full were switched in notification templates. (#380)<br>\n - Closes #378<br>\n<br>\n - 0.39.7<br>\n - Scrub watch snapshot fixes<br>\n - Simple HTTP auth (#372)<br>\n - Adding note about JS pages<br>\n - Notification settings defaults and validation (#361)<br>\n - Filters settings helper text tidy-up<br>\n - Add test for low-level network error text handling<br>\n - Add API endpoint for current snapshot (#359)<br>\n - Clarify notice/messages around changing ignore text<br>\n<br>\n - 0.39.6<br>\n - Heroku tweaks (backup download) (#356)<br>\n - XPath support (#355)<br>\n - Better handling of EmptyReply exception, always bump &#39;last_checked&#39; in the case of an error (#354)<br>\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)<br>\n - fix typo in README.md (#350)<br>\n - Re #348 - Add test for backup, use proper datastore path<br>\n - Update README.md<br>\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)<br>\n - Re #340 - snapshot should not be modified by ignore text (#344)<br>\n - Re #133 Option for ignoring whitespacing (#345)<br>\n - Re #342 notification encoding (#343)<br>\n - Update README.md<br>\n - Adding global ignore text (#339)<br>\n - Adding new proxyType to selenium mappings<br>\n - Use selenium 4.1.0<br>\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594<br>\n - Add socksVersion mapping (#331)<br>\n - Fix broken RSS link fields<br>\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you&#39;re watching, and RSS Title is the page you&#39;re watching<br>\n - Unify Filters and Triggers tabs into a single tab<br>\n - Move &#39;request type&#39; field to the new &#39;Requests&#39; tab<br>\n - Aligning call signatures #325<br>\n - Extend Request Parameters to add Body &amp;amp; Method (#325)<br>\n - Update README.md<br>\n - Create CONTRIBUTING.md<br>\n - Update README.md<br>\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)<br>\n - Update README.md<br>\n - Update README.md<br>\n - Update README.md<br>\n<br>\n - 0.39.5<br>\n - Update feature_request.md<br>\n - Update issue templates<br>\n - Update bug_report.md<br>\n - Update issue templates<br>\n - W3C HTML validation issue around RSS icon<br>\n - Closes #323 adds link to wiki<br>\n - Update README.md<br>\n - Update README.md<br>\n - improve theming docs<br>\n - Update README.md<br>\n - Update README.md<br>\n - Closes #315 - Include library apprise Notify_mqtt<br>\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)<br>\n - Go back to docker hub<br>\n - RSS allow access via token (#310)<br>\n - Adding deploy to Heroku button<br>\n - Adding heroku app.json app<br>\n - Tweak runtime Heroku version<br>\n - Tweaking heroku Procfile<br>\n - Adjust buildpacks on Heroku<br>\n - Adding heroku python3 runtime config<br>\n - Try simpler heroku recipe<br>\n - -C option to create a datadir if it doesnt exist<br>\n - Re #308 - Adding test and including settings in clone operation (#309)<br>\n - fixing too small font in diff UI (#260)<br>\n - Update README.md<br>\n - Send diff in notifications (#296)<br>\n - Fix scrub form theme<br>\n - Scrub dates: Fix date regex limit handler parsing<br>\n - Wait 60 seconds or until stop_thread is set<br>\n - Check that a notification URL is set when sending the test notification (#300)<br>\n - Flask 2 (#299)<br>\n - Re #269 - Show current/correct BASE_URL information (#271)<br>\n - Re #269 - Fix env var comment name<br>\n - Enable Markdown and HTML notifications. (#288)<br>\n<br>\n - 0.39.4 release<br>\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)<br>\n - Fix element paths when using reverse proxy subfolder (#272)<br>\n<br>\n - 0.39.3 release<br>\n - Re #264 - fixing clone watch operation<br>\n - Re #265 - extended jsonpath support (#266)<br>\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly<br>\n - Re #257 - Handle bool val of json path better (#263)<br>\n - Re #249 - Add EXPOSE 5000 to Dockerfile<br>\n - Provide better combination of chardet and urllib3<br>\n - Prefer GHCR.io over DockerHub (#245)<br>\n - Limit branches/tags of container build<br>\n - Re #213 - Adding screensize examples to selenium container<br>\n - Be more specific about tagged release builds<br>\n - Fix :latest release worflow syntax check<br>\n - Form helper - explain where the webdriver setting comes from<br>\n - Rename workflow name<br>\n - Just &#39;published&#39; and &#39;edited&#39; package release is enough (remove &#39;created&#39;)<br>\n<br>\n - Fixing workflow tag syntax issues<br>\n - fix broken workflow syntax<br>\n - add step for metadata debug, see if it runs by checking workflow tag name<br>\n - Container build/push doesnt need to be so specific<br>\n - Oops on/release was in the wrong block<br>\n - release also on edited, published<br>\n - Run workflow on release<br>\n - Use a better switch mechanism for build type<br>\n - version 0.39.2<br>\n - Configurable BASE_URL (#228)<br>\n - Split python pip builder to its own release based workflow<br>\n - remove accidental syntax add<br>\n - Re #242 - app was treating notification field defaults as the field value (#244)<br>\n - attempt to re-enable docker layer cache<br>\n - Forgot GHCR tag with version<br>\n - Limit container build to releases and master<br>\n - Fix GHCR login<br>\n - Use the same workflow for tag and release<br>\n - Drop redundant build workflow<br>\n - try :latest and :tag in same workflow run<br>\n - Separate workflows<br>\n - Docker image build issues (#243)<br>\n - Re #239 - Individual GUID for watch+changeevent (#241)<br>\n - Update README.md<br>\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)<br>\n - Setting for Extract &amp;lt;title&amp;gt; as title option on individual watches (#229)<br>\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7<br>\n - GitHub container repo (#227)<br>\n - Remove extra build step<br>\n - push github container master also<br>\n - Tidy up workflow names<br>\n - Attempt to setup GitHub Container Registry<br>\n<br>\n - v0.39.1<br>\n - Re #185 - [feature] Custom notifications templates per watch (#226)<br>\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)<br>\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title<br>\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title<br>\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)<br>\n - Adds &#39;Create Copy&#39; feature to clone a watch (#184)<br>\n - adding specific test (#205)<br>\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)<br>\n - Re #203 - validate tokens (#204)<br>\n - No point hiding the notifications customisation area because it&#39;s now in its own tab<br>\n - Update README.md<br>\n - Test - prove that notifications are not being sent when content does not change<br>\n - remove quotes from env vars<br>\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts<br>\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label<br>\n - Update README.md<br>\n<br>\n - Installation via pip (#186)<br>\n - Update README.md<br>\n - Trigger text/wait (#187)<br>\n - Reword group tag - more obvious name<br>\n - Fix img alt/title accesibility for pause icon<br>\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway<br>\n - Example placeholder was pushed out<br>\n - Move fetcher tab back to general - save space on mobile<br>\n - WebDriver test fetch should use environment var too<br>\n - Add fetch option to each watch<br>\n - Chrome/Webdriver support for Javascript websites (#114)<br>\n - Fixing tar npm security issue npm install&nbsp;&nbsp;&#34;tar@&amp;gt;=6.1.2&#34;<br>\n<br>\n - tag 0.38.2<br>\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break &#34;Cookie&#34; header (#175)<br>\n - Update heroku.yml<br>\n - Re #156 - PORT should always be an Integer<br>\n - Re #159 - Adding env var example to docker-config.yml<br>\n - Add Heroku Deployment Support (#159)<br>\n - Re #154 - Handle missing JSON better<br>\n - high res<br>\n - higher res screenshot<br>\n - Update screenshot<br>\n - Assert that html_tools.JSONNotFound is correctly raised<br>\n - Re #154 Ldjson extract parse (#158)<br>\n - Responsive fix for input field on mobile<br>\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.<br>\n - Add medium-size-desktop class to notification custom title<br>\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services<br>\n - Re #150 - stop using &#39;size&#39; across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)<br>\n - fix: setting overflow in mobile view (#150)<br>\n - Re #121, #123 - Show the current base_url value<br>\n - Re #149 - allow empty timestamp limit for scrub operation<br>\n - Dont show &#34;new version available&#34; message when password is enabled and user is logged out<br>\n - test fix - dont trigger notifications in header test<br>\n - Strengthen the notification tests<br>\n - Re #137 - Adding test to confirm that headers are not repeated<br>\n - Add debug output to notify loop<br>\n - Add note to field<br>\n - Cleanup test helper data before and after running<br>\n - Improve debug info<br>\n<br>\n - 0.38.1 tag<br>\n - Re #143 - Remove old notification test code, fix form handler (#145)<br>\n - Update README.md<br>\n - Re #135 - refactor the quick add widget (#136)<br>\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)<br>\n<br>\n - use a github action for getting the tag<br>\n - rename tag build runner<br>\n - fix tag<br>\n - build and push tag<br>\n - Re #76 - Fixing links<br>\n - Cleaner is to let flexbox overflow and scroll on the X where needed<br>\n - #76 app path prefix when behind proxy_pass (#91)<br>\n - Settings: Remove password link fix<br>\n - Make sure right menu is still visible when URL is long<br>\n - 0.38 release<br>\n - Re #132 - Make a list of the JSONpath results instead of using only the first value<br>\n - Customisable notifications (#123)<br>\n - Re #117 - dont re-encode single value types, looks better in the diff<br>\n - Usability tweak - [edit] on diff page should go back to diff page<br>\n - Update README.md<br>\n - Adding text about JSON API Monitoring<br>\n - Re #117 Jsonpath based JSON change detection filter (#125)<br>\n - Update README.md<br>\n - Update README.md<br>\n - Use right sticky for version<br>\n - Re #118 - Make &#39;show current version&#39; more obvious<br>\n - Diff page - use the document title in &amp;lt;title&amp;gt; for better bookmarking<br>\n - node-sass 6.0.1 works with node-sass watch way better<br>\n - Updating inscriptis/text/html library to 1.2<br>\n - Update readme with the branch link for javascript support<br>\n - Updating trim-newlines packages<br>\n<br>\n - 0.37 release<br>\n - #110 global recheck time (#113)<br>\n - Re #106 - handling empty title with gettr cleanup (#107)<br>\n - Update README.md<br>\n - Auto extract html title as title (#102)<br>\n - Bug fix - Check &#39;minutes_between_check&#39; is set<br>\n - tweak &amp;lt;pre&amp;gt; text wrapping when displaying diff<br>\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<br>\n - CSS Filter - restore nicer linefeeds<br>\n - @todo Comment - BS4&#39;s element.get_text() seems to lose the indentation format no-matter what<br>\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines<br>\n - Include statistics for number of watches<br>\n - Set edit-form for settings+watch to always be wide<br>\n<br>\n - Update README.md<br>\n - 0.36<br>\n - Re #42 - dont use blank titles<br>\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage<br>\n<br>\n - 0.35<br>\n - Time between rechecks is always stored as minutes<br>\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance<br>\n - Adding tests for password control handling<br>\n - Remove unused field (removepassword is actually a link)<br>\n<br>\n - 0.34<br>\n - Be sure not to use blank passwords as the password<br>\n - Re #42 - custom title (#98)<br>\n - Re #92 - Re-use existing [preview] function for viewing current (#97)<br>\n<br>\n - 0.33<br>\n - #81 - Regex support (#90)<br>\n - Use wtforms handler (#96)<br>\n - Re #95 - Include PUID/PGID example<br>\n - re-enable tests<br>\n - On settings submit, display saved message<br>\n - Use flasks&#39; built in &#39;flash&#39; method instead of a custom message/notices (#94)<br>\n - Adding rPi support info<br>\n - Re #92 Adding link to CSS selector help in wiki<br>\n - Re #93 - tweak build packages<br>\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc<br>\n - Strip surrounding whitespace from elements (#89)<br>\n - Queue an entry for immediate recheck after [edit]<br>\n - Adding helper method to remove text files that are not in the index<br>\n - Fix typo<br>\n - Re #88 - placeholder text on CSS rule<br>\n - Re #86 - fix typo<br>\n<br>\n - 0.32 release<br>\n - Sassify the diff page<br>\n - &#34;Sassify&#34; the theme, easier to manage<br>\n - Mobile fixes (#87)<br>\n - Re #86 - Refactor scrub date limit code<br>\n - Tweak comments<br>\n - Re #77 - Repair and refactor time threshold check code<br>\n - Modifies Dockerfile to use multistage builds (#79)<br>\n - Bumping to 0.31<br>\n<br>\n - Re #75 - Adding test to confirm watched URL appears in RSS feed<br>\n - CSS selector filter (#73)<br>\n - Fixing var name<br>\n - Include release metadata during github build<br>\n - Update README.md<br>\n - Re #40 Ability to set individual timers (#72)<br>\n - Update README.md<br>\n - Improvements for backup (#70)<br>\n - Update README.md<br>\n - Disable image layer cache service<br>\n - Re-enable ARM v6/v7 builds<br>\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size<br>\n - Remove rust build comments<br>\n - Arm build fixes (#68)<br>\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)<br>\n - Update README.md<br>\n - Adding BTC support instructions<br>\n - Switch to just amd64 for now due to apprise not building on ARM<br>\n - Fixing syntax<br>\n - Re #49 Re #60 - Adding more information about proxy setup to README.md<br>\n - Add socks proxy support (#60)<br>\n - Created docker-compose file (#55)<br>\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in &#39;seconds&#39; instead of minutes)<br>\n - 56 - Fix notification test<br>\n - Update README.md<br>\n - Update README.md<br>\n - Adding rust compiler :(<br>\n - trying without libssl and only libffi<br>\n - Adding extra libs required for build<br>\n - Cleanup docs<br>\n - Tweak workflow (tests)<br>\n<br>\n - Security update<br>\n - Apprise notifications (#43)<br>\n - Fixing security update<br>\n - Also detect pytest in the environ (for local debug)<br>\n - Prepend &#39;test-&#39; when runnning under pytest to guid<br>\n - - Relabel login button - misc test cleanup<br>\n - Re #46 - Add note to README.md about Javascript support<br>\n - Bumping version<br>\n - Re #45 - Set datastore path in app.config<br>\n - Re #44 - Broke the menu by accident, adding tests and fixing.<br>\n - bump to 0.29<br>\n<br>\n - docker-compose for dev not needed (use venv etc)<br>\n - Password protection / login support (#34)<br>\n - Update FUNDING.yml<br>\n - Skip using tag limit on pause when no tag is being viewed<br>\n - Pause/Unpause should respect limit tag on redirect<br>\n - Validate duplicate URLs<br>\n - Chdir is not needed because we add the file from the full path, but make it &#39;relative&#39; in the Zip<br>\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)<br>\n - Adding noopener per CodeQL, stop pages from knowing the referer etc<br>\n - Create codeql-analysis.yml<br>\n - yarl not needed, lock requests version<br>\n - dev packages needed, drop apt cache<br>\n - See if we get a clean buildx without dev packages<br>\n - Tweaking build size thanks to https://github.com/hadolint/hadolint<br>\n - Adding dockerignore<br>\n - Re #18 - Show &#34;preview&#34; of the page when only one revision exists (#33)<br>\n - Update README.md<br>\n - Update README.md<br>\n - Also check that the watch is not paused before putting it into the checking queuex<br>\n - revert c60be562718d23972d7d43821bb6b87f2add3256<br>\n - remove extra packages (#32)<br>\n<br>\n - Bumping version to 0.28<br>\n - Docker push amd64 rpi etc (#28)<br>\n - Open [diff] links into their own window<br>\n - Fix auto jump on viewing the diff<br>\n - Re #30 - Delete history watch snapshots (#31)<br>\n - Slow down the DB write interval and catch the case that it changed during write<br>\n - Immediately &#39;jump&#39; to the change<br>\n - Tweak to hover pause icon<br>\n - Stop runtime error on dict changing during write/init at start (#27)<br>\n - Re #22 - ability to pause<br>\n - Re #23 - always check value of interval time, not just on start<br>\n - Update README.md<br>\n - Use absolute image links so the screenshots work from docker hub<br>\n - Update README.md<br>\n - Updating screenshot<br>\n - Reuse the GUID if we have one<br>\n<br>\n - Dont show &#39;empty&#39; tag, it will be in the [ALL] list<br>\n - Adding RSS feed icon<br>\n - Generic object sync should use private method<br>\n - Add missing urllib3<br>\n - Add missing pytz<br>\n - Check for new version<br>\n - Fix import form flow logic<br>\n - Code tidy/lint<br>\n - Tidy up thread logic and version check<br>\n - Add missing dep<br>\n - Remove todos<br>\n - Add icon for RSS, RSS should show only unviewed entries<br>\n - Issue #7 - RSS feeds<br>\n - Always override tag version (load from disk in future, so we can add it at build time)<br>\n - next dev is 0.27<br>\n - Tweak to tests<br>\n - Move logic<br>\n - Remove erroneous extra liveserver setup<br>\n - When new ignore text is specified, reprocess the checksum<br>\n - Adding filter and log output to pytest<br>\n - Fix edit action link<br>\n - Minor lint cleanup<br>\n - Clean up after test case<br>\n - Remove liveserver, doesnt belong here<br>\n - Fix syntax, Triggers the workflow on push or pull request events<br>\n - Activate workflow on all branches<br>\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text<br>\n - Validation of added headers, should contain key/val (2 parts)<br>\n - Issue #12 include version for easy reference.<br>\n - Bring dev environment inline<br>\n - Tidying up requirements.txt<br>\n<br>\n - Handle the case of someone supplying a bad link<br>\n - Adding jump to next change diff widget<br>\n - Moving nice screenshot to above the fold :)<br>\n - Adding docker hub badge for tag information<br>\n<br>\n - Bumping schema tag to 0.25<br>\n - Issue #5 - Remove arbitrary &#39;600&#39; minutes limit<br>\n - Add test delay for github action test<br>\n - Add wait for threads in test<br>\n - Extending tests to cover resetting the diff/unviewed status correctly<br>\n - Tidy up return logic<br>\n - Code tidy<br>\n - Fix docker app files paths<br>\n - Tweaking Dockerfile for new eventlet wrapper<br>\n - Create LICENSE<br>\n - Adding docker pulls counter badge<br>\n - Use master branch for badge<br>\n - Removing unused import<br>\n - Fixing a few more easy lint wins<br>\n - Linting fixups<br>\n - Update README.md<br>\n - Add badge under pytest branch<br>\n - Create python-app.yml<br>\n - Create the test datastore<br>\n - Minor cleanup<br>\n - Just use the current/previous md5<br>\n - Finalse pytest methods<br>\n - Port should be an integer<br>\n - Tweaking client<br>\n - remove unused imports<br>\n - Use session/client fixture<br>\n - Addingmissing files<br>\n - hack of pytest implementation - doesnt work yet<br>\n - Tidy up a few broken datastore paths<br>\n - WIP, separate out the Flask from everything else, get pytest working<br>\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold<br>\n<br>\n - Adding 0.24 tag<br>\n - Avoid accidently using Python&#39;s objects that are copied - but land as a &#39;soft reference&#39;, need to use a better dict struct in the future #6<br>\n - Minor fix to &#39;last changed&#39; field, simplify template and logic<br>\n - Remove debug print<br>\n<br>\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch<br>\n<br>\n - Adding tag to json<br>\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old<br>\n - Minor fix - load extra stylesheet only once<br>\n - Minor tweaks for development setup<br>\n - Provide named containers and remove all existing<br>\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)<br>\n - Flag for immediate sync of index after adding new watch<br>\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member<br>\n - Adding ARG to Dockerfile<br>\n - Include the triggered build SHA as part of the backup info, when built in docker hub.<br>\n - Add cache busting var to style sheets<br>\n - Slightly more bulletproof instructions<br>\n - Updating screenshot<br>\n - Push newly created watches directly into the update check Queue.<br>\n - Adding checkall<br>\n - Easily download a full backup<br>\n - Show the date/time of the current/most up to date version<br>\n - Use a pool of thread workers, better for huge lists of watchers<br>\n - Code cleanup edit submit handler can be the same function<br>\n - Add update howto<br>\n - Refactor slightly confusing difference build function<br>\n - Version comparison had the wrong order<br>\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<br>\n<br>\n - Include the current URL in the page when viewing the version diff<br>\n - Include a selfcheck/diagnosis routine<br>\n - On manual recheck request, redirect to same tag listing<br>\n - Set default diff type to &#39;lines&#39;, faster for starters.<br>\n - Supply different versions to browse<br>\n - Fix heading<br>\n - Update README.md<br>\n - Adding diff screenshot<br>\n - Add more start-up examples<br>\n - Tweak theming<br>\n - Use a even simpler run command<br>\n - improve the wording<br>\n - Add basic settings page (so far just recheck time in minutes)<br>\n - Updating README<br>\n - Updating screenshot (new diff button)<br>\n - Trigger write index after edit of a watch<br>\n - Add [diff] mechanism<br>\n - Use a single thread for writing the sync json<br>\n - Use existing tag<br>\n - When all items showed, show which tag it belongs to<br>\n - Sort tag list<br>\n - Set active tag selection<br>\n - Support for comma separated tags<br>\n - Tweak styling for &#39;new watch&#39; form<br>\n - Remove import for old lib<br>\n - Switch to inscriptis prepare config backend struct<br>\n - Support for custom headers per watch<br>\n - Going back to larger PNG screenshot, looks better in Github :)<br>\n - Fix alt text in markup<br>\n - Adding new screenshot binary<br>\n - Updating screenshot<br>\n - Moving start text to a more visible part<br>\n - Tweak messages<br>\n - Change message text<br>\n - Fixing messages styling<br>\n - Basic tag browse buttons<br>\n - Bulk import<br>\n - Tidy up &#39;last_checked&#39; date handling<br>\n - Dev environment setup<br>\n - Dev docker tweaks<br>\n - Remove messy text<br>\n - Tweaking text<br>\n - Fixing checkall hook<br>\n - Use requests&#39;s r.text so we dont have to deal with charsets<br>\n - Add note<br>\n - Fix bad copy command<br>\n - Oops left out the image name<br>\n<br>\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io<br>\n - Update screenshot<br>\n<br>\n - Add more start-up examples<br>\n - Tweak theming<br>\n - Use a even simpler run command<br>\n - improve the wording<br>\n - Add basic settings page (so far just recheck time in minutes)<br>\n - Updating README<br>\n - Updating screenshot (new diff button)<br>\n - Trigger write index after edit of a watch<br>\n - Add [diff] mechanism<br>\n - Use a single thread for writing the sync json<br>\n - Use existing tag<br>\n - When all items showed, show which tag it belongs to<br>\n - Sort tag list<br>\n - Set active tag selection<br>\n - Support for comma separated tags<br>\n - Tweak styling for &#39;new watch&#39; form<br>\n - Remove import for old lib<br>\n - Switch to inscriptis prepare config backend struct<br>\n - Support for custom headers per watch<br>\n - Going back to larger PNG screenshot, looks better in Github :)<br>\n - Fix alt text in markup<br>\n - Adding new screenshot binary<br>\n - Updating screenshot<br>\n - Moving start text to a more visible part<br>\n - Tweak messages<br>\n - Change message text<br>\n - Fixing messages styling<br>\n - Basic tag browse buttons<br>\n - Bulk import<br>\n - Tidy up &#39;last_checked&#39; date handling<br>\n - Dev environment setup<br>\n - Dev docker tweaks<br>\n - Remove messy text<br>\n - Tweaking text<br>\n - Fixing checkall hook<br>\n - Use requests&#39;s r.text so we dont have to deal with charsets<br>\n - Add note<br>\n - Fix bad copy command<br>\n - Oops left out the image name<br>\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io<br>\n - Update screenshot<br>\n<br>\n - Add more start-up examples<br>\n - Tweak theming<br>\n - Use a even simpler run command<br>\n - improve the wording<br>\n - Add basic settings page (so far just recheck time in minutes)<br>\n - Updating README<br>\n - Updating screenshot (new diff button)<br>\n - Trigger write index after edit of a watch<br>\n - Add [diff] mechanism<br>\n - Use a single thread for writing the sync json<br>\n - Use existing tag<br>\n - When all items showed, show which tag it belongs to<br>\n - Sort tag list<br>\n - Set active tag selection<br>\n - Support for comma separated tags<br>\n - Tweak styling for &#39;new watch&#39; form<br>\n - Remove import for old lib<br>\n - Switch to inscriptis prepare config backend struct<br>\n - Support for custom headers per watch<br>\n - Going back to larger PNG screenshot, looks better in Github :)<br>\n - Fix alt text in markup<br>\n - Adding new screenshot binary<br>\n - Updating screenshot<br>\n - Moving start text to a more visible part<br>\n - Tweak messages<br>\n - Change message text<br>\n - Fixing messages styling<br>\n - Basic tag browse buttons<br>\n - Bulk import<br>\n - Tidy up &#39;last_checked&#39; date handling<br>\n - Dev environment setup<br>\n - Dev docker tweaks<br>\n - Remove messy text<br>\n - Tweaking text<br>\n - Fixing checkall hook<br>\n - Use requests&#39;s r.text so we dont have to deal with charsets<br>\n - Add note<br>\n - Fix bad copy command<br>\n - Oops left out the image name<br>\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io<br>\n - Update screenshot<br>\n - Add edit UI Move to keyed structure instead of list<br>\n - Fixes to CSS<br>\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads<br>\n - Tweaks to docker layout<br>\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc<br>\n - Create FUNDING.yml<br>\n<br>\n - Specify image name in docker files to avoid a confusing build/run<br>\n - Tidy up devel docker<br>\n - Tweak comments<br>\n - Avoid recasting the type<br>\n - Store a history of changes, used for future lookup/diff/explore changes UI<br>\n - Update README.md<br>\n - Show the backend error in the table if there is one<br>\n - Include screenshot<br>\n - Fix branch name<br>\n - Tweak todo<br>\n - Adding README amd docker info<br>\n - Add missing file<br>\n - Primitive support for extra headers<br>\n - remove debug<br>\n - Handle titles and links<br>\n - Fix base definition of the watcher<br>\n - sort by last changed<br>\n - fix button size<br>\n - Store the html2text version too<br>\n - fix favicon<br>\n - small fixes<br>\n - Handle errors better, use the plaintext output<br>\n - Workon threads<br>\n - WIP<br>\n - Remove nocache experimental<br>\n - Initial commit<br>\n<br>\n&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;", "url": "smtp2go://info@bvs-kassen.de/api-FD02EAF14E8B46C9993479DCBA517C79/info@bvs-kassen.de/?from=\"Changedetection%20Dashboard\"&avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=html", "original_context": {"base_url": "https://change.bvs-kassen.de/", "change_datetime": "2026-04-29 14:46:27 CEST", "current_snapshot": "<html><head><meta name=\"color-scheme\" content=\"light dark\"></head><body><pre style=\"word-wrap: break-word; white-space: pre-wrap;\"> _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-04-29 12:10:47 +0200:\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 &lt;5,&gt;=4.9.0 to &gt;=4.13.1,&lt;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 &amp;nbsp; 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 `&lt;head&gt;` 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 &amp; 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 &amp; 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&amp;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 &amp; 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 &lt;title&gt; 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 &lt;-&gt;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` -&gt; `&lt;br&gt;` 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 &lt;select&gt; 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 &lt;title&gt; 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 &lt;title&gt;, `{{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 &amp; 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 - &lt;Select&gt; by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &lt;button&gt; (#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 &amp; 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\u00c3\u00a9t\u00c3\u00a9 Fran\u00c3\u00a7aise du Radiot\u00c3\u00a9l\u00c3\u00a9phone (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 &gt; 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 &amp; 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 &lt;title&gt; as title should work on all processors (#2490)\n - Restock &amp; 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 -&gt; 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 &amp; 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/&lt;uuid&gt;/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 &lt;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 &lt;title&gt; 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 - &lt;input&gt; 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 -&gt; tags -&gt; 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 &lt;div&gt; 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 &lt;/span&gt; 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 `&lt;/br&gt;` 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 &gt;=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 &amp; 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 &amp; 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 &amp; python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker &amp; 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 &amp; 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 &amp; 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 &amp; 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 &lt;pre&gt; - 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 &amp; 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 &lt;title&gt; 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@&gt;=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 &lt;title&gt; 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 &lt;pre&gt; 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</pre></body></html>", "diff": "", "diff_clean": "", "diff_added": "@changed_PLACEMARKER_OPENHEAD / 2026-04-29 09:11:03 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-04-29 12:10:47 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - API - Add restock config to API /v1/watch/ json output #4099 (#4103)@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - API - watch.link was accidently a tuple, enforcing string (#4104)@changed_into_PLACEMARKER_CLOSED", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://change.bvs-kassen.de/diff/c47245b6-2403-41f5-8635-e3d47f5e2c80", "markup_text_links_to_html_links": false, "notification_timestamp": 1777466810.5456655, "prev_snapshot": "<html><head><meta name=\"color-scheme\" content=\"light dark\"></head><body><pre style=\"word-wrap: break-word; white-space: pre-wrap;\"> _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-04-29 09:11:03 +0200:\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 &lt;5,&gt;=4.9.0 to &gt;=4.13.1,&lt;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 &amp;nbsp; 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 `&lt;head&gt;` 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 &amp; 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 &amp; 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&amp;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 &amp; 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 &lt;title&gt; 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 &lt;-&gt;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` -&gt; `&lt;br&gt;` 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 &lt;select&gt; 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 &lt;title&gt; 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 &lt;title&gt;, `{{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 &amp; 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 - &lt;Select&gt; by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &lt;button&gt; (#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 &amp; 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\u00c3\u00a9t\u00c3\u00a9 Fran\u00c3\u00a7aise du Radiot\u00c3\u00a9l\u00c3\u00a9phone (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 &gt; 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 &amp; 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 &lt;title&gt; as title should work on all processors (#2490)\n - Restock &amp; 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 -&gt; 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 &amp; 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/&lt;uuid&gt;/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 &lt;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 &lt;title&gt; 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 - &lt;input&gt; 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 -&gt; tags -&gt; 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 &lt;div&gt; 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 &lt;/span&gt; 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 `&lt;/br&gt;` 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 &gt;=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 &amp; 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 &amp; 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 &amp; python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker &amp; 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 &amp; 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 &amp; 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 &amp; 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 &lt;pre&gt; - 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 &amp; 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 &lt;title&gt; 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@&gt;=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 &lt;title&gt; 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 &lt;pre&gt; 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</pre></body></html>", "preview_url": "https://change.bvs-kassen.de/preview/c47245b6-2403-41f5-8635-e3d47f5e2c80", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "c47245b6-2403-41f5-8635-e3d47f5e2c80", "watch_mime_type": "text/plain", "watch_tag": "Software", "watch_title": "Changedetection.io", "watch_url": "https://changedetection.io/CHANGELOG.txt", "watch_uuid": "c47245b6-2403-41f5-8635-e3d47f5e2c80", "notification_urls": ["smtp2go://info@bvs-kassen.de/api-FD02EAF14E8B46C9993479DCBA517C79/info@bvs-kassen.de/?from=\"Changedetection%20Dashboard\""], "notification_title": "{{watch_title}} \u00c4nderungsmitteilung", "notification_body": "Auf {{watch_url}} hat sich etwas ge\u00e4ndert:\r\n---\r\n{{diff_url}}\r\n---\r\n{{diff_added}}\r\n---\r\n{{current_snapshot}}", "notification_format": "htmlcolor", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://change.bvs-kassen.de/edit/c47245b6-2403-41f5-8635-e3d47f5e2c80", "raw_diff": ""}}]
  • Wed 29 Apr 2026 02:46:45 PM - SENDING - [{"title": "https://status.lexware.de \u00c4nderungsmitteilung", "body": "Auf https://status.lexware.de hat sich etwas ge\u00e4ndert:<br>\n---<br>\nhttps://change.bvs-kassen.de/diff/75e993f4-5d36-4d46-b28c-f0ff566c7694<br>\n---<br>\n<br>\n---<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hauptmen\u00fc \u00f6ffnen<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System-Status<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System-Status<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Abonnement verwalten<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Support<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Status-Aktualisierungen abonnieren<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Alle Systeme funktionieren einwandfrei!<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Haben Sie technische Schwierigkeiten? Bitte wenden Sie sich an den Support<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ausgangsbelege<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Benutzer & Vertr\u00e4ge verwalten<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buchhaltung<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E-Mail Versand<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hilfe & Support<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Kontakte<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lohn & Gehalt<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mobile Apps<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Online Banking<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REST-API<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Steuerberater-Zugang<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Startseite office.lexware.de<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Suche<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Virenscanner<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lexware Gesch\u00e4ftskonto<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Datenexport<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u00a9 2026<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Status-API<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Impressum<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Datenschutzerkl\u00e4rung<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;help@lexware.de<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;Powered by Sorry\u2122<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bedienfeld schlie\u00dfen", "url": "smtp2go://info@bvs-kassen.de/api-FD02EAF14E8B46C9993479DCBA517C79/info@bvs-kassen.de/?from=\"Changedetection%20Dashboard\"&avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=html", "original_context": {"base_url": "https://change.bvs-kassen.de/", "change_datetime": "2026-04-29 14:46:27 CEST", "current_snapshot": " Hauptmen\u00fc \u00f6ffnen\n System-Status\n System-Status\n Abonnement verwalten\n Support\n Status-Aktualisierungen abonnieren\n\n Alle Systeme funktionieren einwandfrei!\n\n Haben Sie technische Schwierigkeiten? Bitte wenden Sie sich an den Support\n\n Ausgangsbelege\n\n Benutzer & Vertr\u00e4ge verwalten\n\n Buchhaltung\n\n E-Mail Versand\n\n Hilfe & Support\n\n Kontakte\n\n Lohn & Gehalt\n\n Mobile Apps\n\n Online Banking\n\n REST-API\n\n Steuerberater-Zugang\n\n Startseite office.lexware.de\n\n Suche\n\n Virenscanner\n\n Lexware Gesch\u00e4ftskonto\n\n Datenexport\n\n \u00a9 2026\n\n Status-API\n |\n Impressum\n Datenschutzerkl\u00e4rung\n help@lexware.de\n\n Powered by Sorry\u2122\n\n Bedienfeld schlie\u00dfen", "diff": "", "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://change.bvs-kassen.de/diff/75e993f4-5d36-4d46-b28c-f0ff566c7694", "markup_text_links_to_html_links": false, "notification_timestamp": 1777466804.853776, "prev_snapshot": " Hauptmen\u00fc \u00f6ffnen\n System-Status\n System-Status\n Abonnement verwalten\n Support\n Status-Aktualisierungen abonnieren\n\n Alle Systeme funktionieren einwandfrei!\n\n Haben Sie technische Schwierigkeiten? Bitte wenden Sie sich an den Support\n\n Ausgangsbelege\n\n Benutzer & Vertr\u00e4ge verwalten\n\n Buchhaltung\n\n E-Mail Versand\n\n Hilfe & Support\n\n Kontakte\n\n Lohn & Gehalt\n\n Mobile Apps\n\n Online Banking\n\n REST-API\n\n Steuerberater-Zugang\n\n Startseite office.lexware.de\n\n Suche\n\n Virenscanner\n\n Lexware Gesch\u00e4ftskonto\n\n Datenexport\n\n K\u00fcrzlich gel\u00f6st ...\n\n Gel\u00f6st Beendet: 14:15 CEST - 22 April 2026\n\n Technische St\u00f6rung: Erreichbarkeit von Lexware Office beeintr\u00e4chtigt\n\n Aufgrund einer technischen St\u00f6rung kann es derzeit zu l\u00e4ngeren Ladezeiten und generellen Verz\u00f6gerungen in der Erreichbarkeit von Lexware Office kommen. Wir a...\n\n Ausgangsbelege Benutzer & Vertr\u00e4ge verwalten Buchhaltung E-Mail Versand Hilfe & Support Kontakte Lohn & Gehalt Mobile Apps Online Banking REST-API Steuerberater-Zugang Startseite office.lexware.de Suche Virenscanner Lexware Gesch\u00e4ftskonto Datenexport\n Hinweis ansehen \u2192\n\n \u00a9 2026\n\n Status-API\n |\n Impressum\n Datenschutzerkl\u00e4rung\n help@lexware.de\n\n Powered by Sorry\u2122\n\n Bedienfeld schlie\u00dfen", "preview_url": "https://change.bvs-kassen.de/preview/75e993f4-5d36-4d46-b28c-f0ff566c7694", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "75e993f4-5d36-4d46-b28c-f0ff566c7694", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "Services", "watch_title": "https://status.lexware.de", "watch_url": "https://status.lexware.de", "watch_uuid": "75e993f4-5d36-4d46-b28c-f0ff566c7694", "notification_urls": ["smtp2go://info@bvs-kassen.de/api-FD02EAF14E8B46C9993479DCBA517C79/info@bvs-kassen.de/?from=\"Changedetection%20Dashboard\""], "notification_title": "{{watch_title}} \u00c4nderungsmitteilung", "notification_body": "Auf {{watch_url}} hat sich etwas ge\u00e4ndert:\r\n---\r\n{{diff_url}}\r\n---\r\n{{diff_added}}\r\n---\r\n{{current_snapshot}}", "notification_format": "htmlcolor", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://change.bvs-kassen.de/edit/75e993f4-5d36-4d46-b28c-f0ff566c7694", "raw_diff": ""}}]
  • Wed 29 Apr 2026 11:46:49 AM - SENDING - null
  • 2026-04-29 11:46:54,762 - DEBUG - Socket Exception: HTTPSConnectionPool(host='api.smtp2go.com', port=443): Read timed out. (read timeout=4.0)
  • 2026-04-29 11:46:54,762 - WARNING - A Connection error occurred sending SMTP2Go:info@bvs-kassen.de notification.
  • 2026-04-29 11:46:49,522 - DEBUG - SMTP2Go Payload: {'api_key': 'api-FD02EAF14E8B46C9993479DCBA517C79', 'sender': 'info@bvs-kassen.de', 'subject': 'Changedetection.io Änderungsmitteilung', 'to': ['info@bvs-kassen.de'], 'html_body': "<string len=158087 head='Auf https://changedetection.io/C' tail='re&gt;&lt;/body&gt;&lt;/html&gt;'>"}
  • 2026-04-29 11:46:49,522 - DEBUG - SMTP2Go POST URL: https://api.smtp2go.com/v3/email/send (cert_verify=True)
  • 2026-04-29 11:46:49,522 - DEBUG - Loaded SMTP2Go URL: smtp2go://info@bvs-kassen.de/a...9/?batch=no&format=html&overflow=upstream
  • Wed 29 Apr 2026 08:46:43 AM - SENDING - [{"title": "https://status.lexware.de \u00c4nderungsmitteilung", "body": "Auf https://status.lexware.de hat sich etwas ge\u00e4ndert:<br>\n---<br>\nhttps://change.bvs-kassen.de/diff/75e993f4-5d36-4d46-b28c-f0ff566c7694<br>\n---<br>\n<br>\n---<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hauptmen\u00fc \u00f6ffnen<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System-Status<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System-Status<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Abonnement verwalten<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Support<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Status-Aktualisierungen abonnieren<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Alle Systeme funktionieren einwandfrei!<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Haben Sie technische Schwierigkeiten? Bitte wenden Sie sich an den Support<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ausgangsbelege<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Benutzer & Vertr\u00e4ge verwalten<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buchhaltung<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E-Mail Versand<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hilfe & Support<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Kontakte<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lohn & Gehalt<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mobile Apps<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Online Banking<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REST-API<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Steuerberater-Zugang<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Startseite office.lexware.de<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Suche<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Virenscanner<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lexware Gesch\u00e4ftskonto<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Datenexport<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;K\u00fcrzlich gel\u00f6st ...<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Gel\u00f6st Beendet: 14:15 CEST - 22 April 2026<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Technische St\u00f6rung: Erreichbarkeit von Lexware Office beeintr\u00e4chtigt<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aufgrund einer technischen St\u00f6rung kann es derzeit zu l\u00e4ngeren Ladezeiten und generellen Verz\u00f6gerungen in der Erreichbarkeit von Lexware Office kommen. Wir a...<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ausgangsbelege Benutzer & Vertr\u00e4ge verwalten Buchhaltung E-Mail Versand Hilfe & Support Kontakte Lohn & Gehalt Mobile Apps Online Banking REST-API Steuerberater-Zugang Startseite office.lexware.de Suche Virenscanner Lexware Gesch\u00e4ftskonto Datenexport<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hinweis ansehen \u2192<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u00a9 2026<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Status-API<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Impressum<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Datenschutzerkl\u00e4rung<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;help@lexware.de<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;Powered by Sorry\u2122<br>\n<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bedienfeld schlie\u00dfen", "url": "smtp2go://info@bvs-kassen.de/api-FD02EAF14E8B46C9993479DCBA517C79/info@bvs-kassen.de/?from=\"Changedetection%20Dashboard\"&avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=html", "original_context": {"base_url": "https://change.bvs-kassen.de/", "change_datetime": "2026-04-29 08:46:25 CEST", "current_snapshot": " Hauptmen\u00fc \u00f6ffnen\n System-Status\n System-Status\n Abonnement verwalten\n Support\n Status-Aktualisierungen abonnieren\n\n Alle Systeme funktionieren einwandfrei!\n\n Haben Sie technische Schwierigkeiten? Bitte wenden Sie sich an den Support\n\n Ausgangsbelege\n\n Benutzer & Vertr\u00e4ge verwalten\n\n Buchhaltung\n\n E-Mail Versand\n\n Hilfe & Support\n\n Kontakte\n\n Lohn & Gehalt\n\n Mobile Apps\n\n Online Banking\n\n REST-API\n\n Steuerberater-Zugang\n\n Startseite office.lexware.de\n\n Suche\n\n Virenscanner\n\n Lexware Gesch\u00e4ftskonto\n\n Datenexport\n\n K\u00fcrzlich gel\u00f6st ...\n\n Gel\u00f6st Beendet: 14:15 CEST - 22 April 2026\n\n Technische St\u00f6rung: Erreichbarkeit von Lexware Office beeintr\u00e4chtigt\n\n Aufgrund einer technischen St\u00f6rung kann es derzeit zu l\u00e4ngeren Ladezeiten und generellen Verz\u00f6gerungen in der Erreichbarkeit von Lexware Office kommen. Wir a...\n\n Ausgangsbelege Benutzer & Vertr\u00e4ge verwalten Buchhaltung E-Mail Versand Hilfe & Support Kontakte Lohn & Gehalt Mobile Apps Online Banking REST-API Steuerberater-Zugang Startseite office.lexware.de Suche Virenscanner Lexware Gesch\u00e4ftskonto Datenexport\n Hinweis ansehen \u2192\n\n \u00a9 2026\n\n Status-API\n |\n Impressum\n Datenschutzerkl\u00e4rung\n help@lexware.de\n\n Powered by Sorry\u2122\n\n Bedienfeld schlie\u00dfen", "diff": "", "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://change.bvs-kassen.de/diff/75e993f4-5d36-4d46-b28c-f0ff566c7694", "markup_text_links_to_html_links": false, "notification_timestamp": 1777445203.1304007, "prev_snapshot": " Hauptmen\u00fc \u00f6ffnen\n System-Status\n System-Status\n Abonnement verwalten\n Support\n Status-Aktualisierungen abonnieren\n\n Alle Systeme funktionieren einwandfrei!\n\n Haben Sie technische Schwierigkeiten? Bitte wenden Sie sich an den Support\n\n Ausgangsbelege\n\n Benutzer & Vertr\u00e4ge verwalten\n\n Buchhaltung\n\n E-Mail Versand\n\n Hilfe & Support\n\n Kontakte\n\n Lohn & Gehalt\n\n Mobile Apps\n\n Online Banking\n\n REST-API\n\n Steuerberater-Zugang\n\n Startseite office.lexware.de\n\n Suche\n\n Virenscanner\n\n Lexware Gesch\u00e4ftskonto\n\n Datenexport\n\n K\u00fcrzlich gel\u00f6st ...\n\n Gel\u00f6st Beendet: 14:15 CEST - 22 April 2026\n\n Technische St\u00f6rung: Erreichbarkeit von Lexware Office beeintr\u00e4chtigt\n\n Aufgrund einer technischen St\u00f6rung kann es derzeit zu l\u00e4ngeren Ladezeiten und generellen Verz\u00f6gerungen in der Erreichbarkeit von Lexware Office kommen. Wir a...\n\n Ausgangsbelege Benutzer & Vertr\u00e4ge verwalten Buchhaltung E-Mail Versand Hilfe & Support Kontakte Lohn & Gehalt Mobile Apps Online Banking REST-API Steuerberater-Zugang Startseite office.lexware.de Suche Virenscanner Lexware Gesch\u00e4ftskonto Datenexport\n Hinweis ansehen \u2192\n\n Abgeschlossen Beendet: 08:00 CEST - 22 April 2026\n\n Ank\u00fcndigung von Wartungsarbeiten\n\n Am Dienstag, den 21.04.2026 finden ab 22.00 Uhr Wartungsarbeiten am System statt. Ab diesem Zeitraum ist Lexware Office im Bereich Lohn & Gehalt nicht ve...\n\n Lohn & Gehalt\n Hinweis ansehen \u2192\n\n \u00a9 2026\n\n Status-API\n |\n Impressum\n Datenschutzerkl\u00e4rung\n help@lexware.de\n\n Powered by Sorry\u2122\n\n Bedienfeld schlie\u00dfen", "preview_url": "https://change.bvs-kassen.de/preview/75e993f4-5d36-4d46-b28c-f0ff566c7694", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "75e993f4-5d36-4d46-b28c-f0ff566c7694", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "Services", "watch_title": "https://status.lexware.de", "watch_url": "https://status.lexware.de", "watch_uuid": "75e993f4-5d36-4d46-b28c-f0ff566c7694", "notification_urls": ["smtp2go://info@bvs-kassen.de/api-FD02EAF14E8B46C9993479DCBA517C79/info@bvs-kassen.de/?from=\"Changedetection%20Dashboard\""], "notification_title": "{{watch_title}} \u00c4nderungsmitteilung", "notification_body": "Auf {{watch_url}} hat sich etwas ge\u00e4ndert:\r\n---\r\n{{diff_url}}\r\n---\r\n{{diff_added}}\r\n---\r\n{{current_snapshot}}", "notification_format": "htmlcolor", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://change.bvs-kassen.de/edit/75e993f4-5d36-4d46-b28c-f0ff566c7694", "raw_diff": ""}}]
  • Tue 28 Apr 2026 02:46:46 PM - SENDING - null
  • 2026-04-28 14:46:51,797 - DEBUG - Socket Exception: HTTPSConnectionPool(host='api.smtp2go.com', port=443): Read timed out. (read timeout=4.0)
  • 2026-04-28 14:46:51,797 - WARNING - A Connection error occurred sending SMTP2Go:info@bvs-kassen.de notification.
  • 2026-04-28 14:46:46,571 - DEBUG - SMTP2Go Payload: {'api_key': 'api-FD02EAF14E8B46C9993479DCBA517C79', 'sender': 'info@bvs-kassen.de', 'subject': 'Changedetection.io Änderungsmitteilung', 'to': ['info@bvs-kassen.de'], 'html_body': "<string len=158000 head='Auf https://changedetection.io/C' tail='re&gt;&lt;/body&gt;&lt;/html&gt;'>"}
  • 2026-04-28 14:46:46,571 - DEBUG - SMTP2Go POST URL: https://api.smtp2go.com/v3/email/send (cert_verify=True)
  • 2026-04-28 14:46:46,571 - DEBUG - Loaded SMTP2Go URL: smtp2go://info@bvs-kassen.de/a...9/?batch=no&format=html&overflow=upstream
  • Tue 28 Apr 2026 11:47:04 AM - SENDING - null
  • 2026-04-28 11:47:09,454 - DEBUG - Socket Exception: HTTPSConnectionPool(host='api.smtp2go.com', port=443): Read timed out. (read timeout=4.0)
  • 2026-04-28 11:47:09,454 - WARNING - A Connection error occurred sending SMTP2Go:info@bvs-kassen.de notification.
  • 2026-04-28 11:47:04,895 - DEBUG - SMTP2Go Payload: {'api_key': 'api-FD02EAF14E8B46C9993479DCBA517C79', 'sender': 'info@bvs-kassen.de', 'subject': 'Noris Updates Änderungsmitteilung', 'to': ['info@bvs-kassen.de'], 'html_body': "<string len=5871 head='Auf https://www.noris-kassensyst' tail=' Logout<br>\\n<br>\\nback-to-top<br>'>"}
  • 2026-04-28 11:47:04,895 - DEBUG - SMTP2Go POST URL: https://api.smtp2go.com/v3/email/send (cert_verify=True)
  • 2026-04-28 11:47:04,894 - DEBUG - Loaded SMTP2Go URL: smtp2go://info@bvs-kassen.de/a...9/?batch=no&format=html&overflow=upstream
  • Tue 28 Apr 2026 08:46:45 AM - SENDING - [{"title": "Changedetection.io \u00c4nderungsmitteilung", "body": "Auf https://changedetection.io/CHANGELOG.txt hat sich etwas ge\u00e4ndert:<br>\n---<br>\nhttps://change.bvs-kassen.de/diff/c47245b6-2403-41f5-8635-e3d47f5e2c80<br>\n---<br>\n<span style=\"background-color: #fadad7; color: #b30000;\" role=\"note\" aria-label=\"Changed text\" title=\"Changed text\">HEAD / 2026-04-28 02:46:40 +0200:</span><br>\n<span style=\"background-color: #eaf2c2; color: #406619;\" role=\"note\" aria-label=\"Changed into\" title=\"Changed into\"> - 0.55.3</span><br>\n<span style=\"background-color: #eaf2c2; color: #406619;\" role=\"note\" aria-label=\"Changed into\" title=\"Changed into\"></span><br>\n<span style=\"background-color: #eaf2c2; color: #406619;\" role=\"note\" aria-label=\"Changed into\" title=\"Changed into\"> - Recompile languages</span><br>\n<span style=\"background-color: #eaf2c2; color: #406619;\" role=\"note\" aria-label=\"Changed into\" title=\"Changed into\"> - 0.55.2</span><br>\n<span style=\"background-color: #eaf2c2; color: #406619;\" role=\"note\" aria-label=\"Changed into\" title=\"Changed into\"> - typo: {{diff_url}} token mentioned twice (#4094)</span><br>\n---<br>\n&lt;html&gt;&lt;head&gt;&lt;meta name=&#34;color-scheme&#34; content=&#34;light dark&#34;&gt;&lt;/head&gt;&lt;body&gt;&lt;pre style=&#34;word-wrap: break-word; white-space: pre-wrap;&#34;&gt;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp; _&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp; _&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp; <br>\n __| |_&nbsp;&nbsp;__ _ _ _&nbsp;&nbsp;__ _ ___ __| |___| |_ ___ __| |_(_)___ _ _&nbsp;&nbsp; (_)___ <br>\n/ _| &#39; \\/ _` | &#39; \\/ _` / -_) _` / -_)&nbsp;&nbsp;_/ -_) _|&nbsp;&nbsp;_| / _ \\ &#39; \\ _| / _ \\<br>\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|___/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>\n<br>\n - 0.55.3<br>\n<br>\n - Recompile languages<br>\n - 0.55.2<br>\n - typo: {{diff_url}} token mentioned twice (#4094)<br>\n - i18n: UI - Align desktop &#34;Last Checked&#34; / &#34;Last Changed&#34; with mobile (#4090)<br>\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091<br>\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)<br>\n - i18n - Recompile languages<br>\n<br>\n - 0.55.1<br>\n - Security - Hardening XML parser against XXE<br>\n - Security - Stored XSS via Tag Name in Modal Dialog<br>\n - Security - Arbitrary Local File Read via crafted backup restore<br>\n - i18n - Update Korean language (#4084)<br>\n - [i18n] &#34;Usage&#34; tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)<br>\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)<br>\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)<br>\n - LLM / AI Change detection rules and Summaries<br>\n - Bumping README<br>\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)<br>\n - CI - Translation sync check (#4085)<br>\n - Update python-engineio requirement from &amp;lt;5,&amp;gt;=4.9.0 to &amp;gt;=4.13.1,&amp;lt;5 (#4079)<br>\n - CI - Re #4080 msgfmt linting (#4081)<br>\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)<br>\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)<br>\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)<br>\n<br>\n - 0.54.10<br>\n - UI - Fix unresponsive &#34;Show advanced help and tips&#34; button on tag edit screen (#4055)<br>\n - Fix untranslated labels on mobile watchlist view (#4064)<br>\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)<br>\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)<br>\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)<br>\n<br>\n - 0.54.9<br>\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)<br>\n - Translations - JA - Recompile<br>\n - Fix strings not rendered in user&#39;s locale despite having .po entries (#4051)<br>\n - Update Japanese translations for new strings and fix fragment handling (#4050)<br>\n - Notifications - Discord #3721 - Dont use &amp;amp;nbsp; for discord (Actually Discord:// notifications should always use plaintext format anyway)<br>\n - Test improvement - text extract tidyup (#4048)<br>\n - Text filters - New simpler filter &#34;Extract lines containing text&#34; (#4046)<br>\n - Handle inline favicons (#4047 #3891 )<br>\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777<br>\n - Add complete Turkish translation (#4044)<br>\n - Czech l12n updates (#4043)<br>\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)<br>\n - Test - word-level diff - Re #4037 - adding test (#4042)<br>\n - Fix/step failure notification crash (#4041)<br>\n - Groups - Set custom colour for tag/group/label background (#4040)<br>\n - fix: pass include_change_type_prefix to word-level diff (#4037)<br>\n - Add Portuguese (Brasil) translation (#4033)<br>\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)<br>\n - diff_changed_from/diff_changed_from tokens - improve documentation<br>\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)<br>\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)<br>\n - UI - Minor text fix and add link to &#39;Restock Backup&#39; from Imports<br>\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)<br>\n - Add Japanese translation (ja) (#4019)<br>\n - UI - German translation: Visual Filter: &#34;Klare Auswahl&#34; is very misleading #4023<br>\n<br>\n - 0.54.8<br>\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering<br>\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)<br>\n - Ensure all unit tests are run (#4022)<br>\n - Extendable theme pluggy implementation for main theme/template `&amp;lt;head&amp;gt;` section&nbsp;&nbsp;(#4011)<br>\n - Update docker-compose.yml<br>\n - Update docker-compose.yml<br>\n<br>\n - 0.54.7<br>\n - Translations - recompiling<br>\n - fix: Czech translation strings updated (#4008)<br>\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )<br>\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters<br>\n - UI - Settings - Dont let &#39;password&#39; field autocomplete (chrome)<br>\n - `last_error` should be cleared if page content was the same and there was no error (#3997)<br>\n - fix: correct critical errors in Spanish (es) translation (#3994)<br>\n - Restock - Add previous_price to restock values #3987 (#3993)<br>\n - UI - Scan/check all proxies - Regression fix from earlier refactor<br>\n - Realtime - Suppress socket.io errors in logs (#3991)<br>\n - UI - Text tidyup (#3989)<br>\n<br>\n - 0.54.6<br>\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)<br>\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)<br>\n - fix: add commit calls for pause and mute operations (#3978)<br>\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)<br>\n<br>\n - 0.54.5<br>\n - CI - YML tidyup<br>\n - Docker image - Improving org.opencontainers labels for dev containers<br>\n - Docker image - Improving org.opencontainers labels #3794<br>\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)<br>\n - UI - Fixing Preview &#34;GO&#34; version button (#3969)<br>\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)<br>\n - Add complete Spanish translation (es) (#3961)<br>\n - Various memory and CPU improvements (#3960)<br>\n - CI - Bump the all group with 5 updates (#3955)<br>\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)<br>\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)<br>\n - Restock - No need to extract the text because it&#39;s not used anyway (#3951)<br>\n<br>\n - 0.54.4<br>\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response<br>\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()<br>\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases<br>\n - Updating API docs with better processor plugin info (#3942)<br>\n - Python 3.14 CI test and support (#3941)<br>\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)<br>\n<br>\n - 0.54.3<br>\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)<br>\n - Adding Ukranian translations, rebuilding translations. (#3936)<br>\n - Update messages.po in French translation (#3926)<br>\n<br>\n - 0.54.2<br>\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)<br>\n - CI workflow - Bump the all group with 2 updates (#3931)<br>\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)<br>\n - API - Processors configuration is now part of the API&nbsp;&nbsp;(#3902)<br>\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)<br>\n - Fixing `change_datetime` notification token (and adding test) (#3922)<br>\n<br>\n - 0.54.1<br>\n - Tests - Tweaks to upgrade path tests<br>\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true<br>\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.<br>\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request<br>\n<br>\n - 0.53.7<br>\n - Libraries/Build - unpin referencing library (#3919)<br>\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)<br>\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)<br>\n<br>\n - 0.53.6<br>\n - Pip installs - remove flask patch and pin library versions<br>\n - Lazy load flask_compress<br>\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress &amp;amp; socket.io<br>\n<br>\n - 0.53.5<br>\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)<br>\n - UI - Backup restore (#3899)<br>\n<br>\n - 0.53.4<br>\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)<br>\n - UI - Search modal - fixes for running in sub path<br>\n - Puppeteer - Adding extra browser cleanup (#3897)<br>\n - Puppeteer - Use a modern scroll method for screenshot stitching<br>\n - UI - CSS - Ensure &#39;difference&#39; &#39;preview&#39; both wraps by word and by very long strings<br>\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)<br>\n - Fix: Some SPA&#39;s also set body content to display: none which breaks text output<br>\n - &#34;Error 200 no content&#34; - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)<br>\n - UI - Filters &amp;amp; Triggers - Adding reminder that you can also use &#39;Conditions&#39; for trigger rules<br>\n - Minor code tidy<br>\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)<br>\n - UI - More fixes for realtime updates<br>\n - UI - Fixing realtime updates for status updates when checking (#3889)<br>\n - Pluggy plugin hook for before and after a watch is processed (#3888)<br>\n<br>\n - 0.53.3<br>\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)<br>\n - UI - Use version from code in version tab<br>\n<br>\n - 0.53.2<br>\n - UI - Watch overview - Restock price, validate number before output (#3883)<br>\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)<br>\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories<br>\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources<br>\n - Browser Steps - Minor code cleanup<br>\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons<br>\n<br>\n - 0.53.1<br>\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)<br>\n - Test - Improve test for watch package download<br>\n - UI - Watch data download, fix test, update text.<br>\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)<br>\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.<br>\n - Avoid reprocessing if the page was the same (#3867)<br>\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)<br>\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)<br>\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)<br>\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)<br>\n - Refactoring upgrade path (#3861)<br>\n - API - Import use background task to import large lists (#3858)<br>\n - API - Bumping docs<br>\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&amp;amp;time_between_check={&#39;hours&#39;:24}&nbsp;&nbsp;Re #3845 (#3857)<br>\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)<br>\n - UI - Bulk checkbox operations modal confirmation fix Re #3853<br>\n - Tags update fix (#3849)<br>\n - Refactor for Tags storage (#3848)<br>\n - Including uptime in UI settings/info<br>\n - Refactor&nbsp;&nbsp;watch saving backend, closes #3846 (#3847)<br>\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)<br>\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)<br>\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833<br>\n - Rebuild translations (#3842)<br>\n - UI - Favicon use lazy load for faster rendering<br>\n - Adding more tests and Watch object improvements (#3841)<br>\n - Improved watch global settings handling (#3839)<br>\n - New datastore message should be warning not critical<br>\n - Improving upgrade path<br>\n - History length limit size option (#3834)<br>\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)<br>\n - Favicon path - cache results<br>\n - UI - Backups tab - styling fix<br>\n - Styling fix for &#34;backups&#34; tab Re #3821<br>\n - UI- Fix possible bug adding tags in quickwatch form<br>\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)<br>\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)<br>\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)<br>\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)<br>\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)<br>\n - UI - Move Default Proxy selection back to &#34;General&#34; tab<br>\n - API - Notification URLs werent always being validated (#3812)<br>\n - Remove deprecated call to strtobool<br>\n - UI - Make watch tags link elements (#3813)<br>\n - test tweak<br>\n - DB data migration upgrade fixes (#3811)<br>\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)<br>\n - Improved catching of errors/exceptions in Browser Steps steps&nbsp;&nbsp;(#3808)<br>\n - Improving default settings for remote reverse proxies (#3806)<br>\n - CLI extra options,&nbsp;&nbsp;&#34;batch mode&#34; see `--help` allows re-checking and adding watches from the CLI (#3802)<br>\n - Update messages.po // German (#3797)<br>\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)<br>\n<br>\n - 0.52.9<br>\n - Memory management improvements&nbsp;&nbsp;for large screenshots, Brotli snapshot improvements (#3798)<br>\n - Updating site.webmanifest for PWA usage<br>\n - Use credentials to fetch web manifest (#3790)<br>\n - Make language selection sticky and provide a way to return back to default auto-detect&nbsp;&nbsp;#3792 (#3795)<br>\n - Element locking &#39;off&#39; by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)<br>\n - Rebuilding language translation files<br>\n - Update French translation (#3788)<br>\n - Open github link on new tab (#3791)<br>\n - Update messages.po // German &#34;From&#34; (#3793)<br>\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794<br>\n<br>\n - 0.52.8<br>\n - Memory - Favicon reader had a memory leak,&nbsp;&nbsp;Restart fetch workers between jobs, misc tweaks&nbsp;&nbsp; (#3787)<br>\n - API -&nbsp;&nbsp;Validation improvements (#3782)<br>\n - i18n - zh traditional chinese autodetect from browser fix<br>\n - UI - Fixes for search dialog #3778 (#3781)<br>\n<br>\n - 0.52.7<br>\n - Fix zh PO duplicates and complete new translations. (#3773)<br>\n - Lots of translation updates (#3772)<br>\n - UI - Global &#34;mute&#34; and &#34;pause&#34; buttons on main menu, move &#34;Backups&#34; to &#34;Settings&#34; (#3769)<br>\n - API &amp;amp; UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)<br>\n - Non blocking improvements (#3767)<br>\n - Improvements to deterministic fix (false triggers) (#3766)<br>\n - Run &#34;clear all history&#34; in background thread to prevent blocking (#3765)<br>\n - Test - Adding missing test<br>\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)<br>\n - Language updates (#3764)<br>\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.<br>\n - UI - Fixing link to scheduler help/tutorial page.<br>\n - Manual update of DE language (and recompile all languages)<br>\n - Recompile CSS<br>\n - UI - Mobile - Empty page watches message and layout improvements (#3760)<br>\n - UI - CSS - Give dark-mode switching a soft transition<br>\n - Edit - More reliable fetch of watch on test (usually affects tests)<br>\n - Manual polish for several translations in the zh locale. (#3757)<br>\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.<br>\n - Languages - Recompile languages, small fix for &#39;de&#39;.<br>\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)<br>\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)<br>\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)<br>\n - 0.52.6<br>\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)<br>\n - UI - Show queue size above watch table in realtime<br>\n<br>\n - 0.52.5<br>\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)<br>\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo<br>\n - i18n: Update zh_Hant_TW translations (#3745)<br>\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)<br>\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737<br>\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)<br>\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)<br>\n<br>\n - 0.52.4<br>\n - Fixing Traditional Chinese locale mapping #3737 (#3738)<br>\n - Languages - Pypi/pip package was missing translations<br>\n<br>\n - 0.52.3<br>\n - UI - Groups - Adding &#39;Recheck&#39; button from groups overview page<br>\n - Minor playwright memory cleanup improvements (#3736)<br>\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)<br>\n<br>\n - 0.52.2<br>\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.<br>\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)<br>\n - UI - Language modal - flag icons should be round<br>\n<br>\n - 0.52.1<br>\n - Development branch merge into release/master<br>\n - Adding test for #3720<br>\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)<br>\n - Update README.md - Info about setting up different viewport sizes<br>\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)<br>\n - API - Watch get, retry watch data if watch dict changed (more reliable)<br>\n - Notification debug log - Use locale of system for dates/times<br>\n - Misc small HTML Validation fixes (#3704)<br>\n<br>\n - 0.51.4<br>\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)<br>\n - Bump actions/checkout from 5 to 6 in the all group (#3651)<br>\n - Specify UTF-8 encoding for xpath_element_js (#3650)<br>\n - Update playwright library to 1.56<br>\n<br>\n - 0.51.3<br>\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)<br>\n<br>\n - 0.51.2<br>\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.<br>\n<br>\n - 0.51.1 Fixing semver version number<br>\n<br>\n - 0.51.01<br>\n<br>\n - 0.51.00<br>\n - UI - Minor text fix for anon history access<br>\n - RSS per watch tweaks (#3635)<br>\n - RSS Feed per watch - Setting order (newest changes first) (#3634)<br>\n - UI - Moving &#39;RSS&#39; options to its own settings tab, RSS - Adding watch history length&nbsp;&nbsp;(#3633)<br>\n - RSS per group! (#3632)<br>\n - UI - Move &#39;Jitter seconds&#39; settings tab from &#34;General&#34; to &#34;Fetching&#34; global Settings.<br>\n - README typo fix and ignore files for emacs style backups<br>\n - RSS feeds for a single watches!<br>\n - Always backup JSON DB on new versions as well as the existing between updates.<br>\n<br>\n - 0.50.43<br>\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms&nbsp;&nbsp;#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<br>\n - Adding data sanity checks across restarts (#3629)<br>\n<br>\n - 0.50.42<br>\n - Revert &#34;Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)&#34;<br>\n<br>\n - 0.50.41<br>\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)<br>\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)<br>\n<br>\n - 0.50.40<br>\n - Page &amp;lt;title&amp;gt; should only be captured on HTML documents (#3608)<br>\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)<br>\n - Real time UI - Remove polling thread for updates - it&#39;s all done realtime by signals (#3603)<br>\n - Watch history - Don&#39;t rescan whole history.txt when looking up a timestamp &amp;lt;-&amp;gt;filepath (#3602)<br>\n - Datastore - Use `orjson` for faster saves (#3601)<br>\n - Scheduler - Saving a couple of CPU cycles in logging strategy<br>\n<br>\n - 0.50.39<br>\n - Time scheduler - Remove cache on time lookup<br>\n - Tests - Adding extra placemarker tests (#3592 #3591 )<br>\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)<br>\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)<br>\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)<br>\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)<br>\n - API - Adding better explanation and usage of History API, bumping doc versions.<br>\n - API - Rebuilding HTML docs<br>\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.<br>\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)<br>\n<br>\n - 0.50.38<br>\n - Improved send test notification handling (#3579)<br>\n<br>\n - 0.50.37<br>\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -&amp;gt; `&amp;lt;br&amp;gt;` etc (#3577) #3538 #3576<br>\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)<br>\n<br>\n - 0.50.35<br>\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573<br>\n - API - Updating index.html of the documentation<br>\n - Optimisations to GitHub test flow<br>\n<br>\n - 0.50.34<br>\n - Fixes to notification &#39;`Send test notification`&#39; (#3571)<br>\n - HTML Notification - Adjusting font to rem size<br>\n - Run all pytests in parallel (#3569)<br>\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)<br>\n - Build/test - Parallel test jobs for faster testing (#3568)<br>\n - Handle `format=` in apprise URLs (#3567)<br>\n - Adding small amount of cache to common functions (#3565)<br>\n - CVE-2025-62780 - Stored XSS in Watch update via API<br>\n<br>\n - 0.50.33<br>\n - Fixing wrong notification type in &amp;lt;select&amp;gt; that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)<br>\n - HTML - Shorten whitespace around timezone names<br>\n - Update 21 for #3496 - Fixing update of timezone setting<br>\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556<br>\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)<br>\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)<br>\n - Build - Actions / Bump the all group with 2 updates (#3550)<br>\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)<br>\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)<br>\n<br>\n - 0.50.32<br>\n - Tests - API - Import - Removed &#39;content-type&#39;: &#39;text/plain&#39; from the test because this should be assumed.<br>\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542<br>\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)<br>\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)<br>\n - Notifications - `post://&#39;, `put://` etc - Catch and show errors and where possible (#3543)<br>\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)<br>\n<br>\n - 0.50.31<br>\n - Changes to colors HTML notification (small contrast between &#39;changed&#39; and &#39;removed&#39; etc) (#3540)<br>\n - tgram:// and discord:// - Small fix for line breaks<br>\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)<br>\n<br>\n - 0.50.30<br>\n - Notifications fixes (#3534) #3531 #3530 #3529<br>\n - Template - Adding `|regex_replace` Re #3501 (#3536)<br>\n - Be sure that default namespaces are registered (#3535)<br>\n<br>\n - 0.50.29<br>\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)<br>\n - Notifications - Refactor/cleanup notification handling and rename &#39;Markdown&#39; to &#34;Markdown to HTML&#34; to make more sense. (#3527) Re #3526 -<br>\n - UI - Fix watch table striping on delete #3523<br>\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)<br>\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)<br>\n - Update beautifulsoup4 requirement (#3471)<br>\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)<br>\n<br>\n - 0.50.28<br>\n - Email notification format fixes (#3525)<br>\n - Empty &#34;ignore text&#34; lines could break ignore text and prevent changes from being detected (#3524)<br>\n<br>\n - 0.50.27<br>\n - Fix error handling for first empty filter response (#3516)<br>\n<br>\n - 0.50.26<br>\n - pip build - Improving fix for #3509, Adding automated test for #3509<br>\n<br>\n - 0.50.25<br>\n - pip build - Be sure to include API spec (#3511)<br>\n - Improved watch delete (#3510)<br>\n - Notification service improved failure alerts for filter missing + browsersteps&nbsp;&nbsp;problems (#3507)<br>\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)<br>\n<br>\n - 0.50.24<br>\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)<br>\n<br>\n - 0.50.23<br>\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now &#39;Europe/London&#39;, &#39;%Y-%m-%d&#39; %}` etc (#3496)<br>\n<br>\n - 0.50.22<br>\n - Testing - Adding test for requests timeout setting #975<br>\n - UI - Add missing &#39;requests timeout in seconds&#39; field to main settings, Re #975<br>\n - UI - Proxy and external browser settings URL validation (#3494)<br>\n - Move proxy default selection to proxy tab<br>\n - Build - Splitting memory report (#3493)<br>\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)<br>\n<br>\n - 0.50.21<br>\n - Adding &#39;RSS reader mode&#39; (see main Settings) (#3488)<br>\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends &#34;text/xml&#34; instead of the &#34;application/atom+xml&#34; header (#3487)<br>\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)<br>\n - No need to reformat/reprocess content in the case that no filters were found&nbsp;&nbsp;(#3484,&nbsp;&nbsp;#3483)<br>\n<br>\n - 0.50.20<br>\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)<br>\n<br>\n - 0.50.19<br>\n - Test speedup - remove common calls for function calls (#3477)<br>\n - Reducing memory usage (#3476)<br>\n - Refactoring text/html difference processor (#3475)<br>\n<br>\n - 0.50.18<br>\n - Always follow plaintext header over the actual content type if its available (#3473) #3472<br>\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)<br>\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)<br>\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)<br>\n<br>\n - 0.50.17<br>\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465)&nbsp;&nbsp;#3462&nbsp;&nbsp;#3391<br>\n - Dependabot tweaks<br>\n<br>\n - 0.50.16<br>\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)<br>\n<br>\n - 0.50.15<br>\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)<br>\n - Filters - Adding &#34;Strip ignored lines&#34; in output option to filters (#3449)<br>\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)<br>\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8<br>\n - Build - Pinning library versions to fix tests<br>\n - Notifications - Upgrade Apprise 1.9.4 (#3443)<br>\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)<br>\n - UI - Implementation of unread counter - adding test<br>\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)<br>\n<br>\n - 0.50.14<br>\n - Time interval field - Extra validation improvements and tests (#3432)<br>\n - UI - Fixing HTML &amp;lt;title&amp;gt; versus custom title settings display in overview (#3430) #3429<br>\n - API - Adding page title link, bumping docs (#3431)<br>\n - &#34;Time between check&#34; field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)<br>\n<br>\n - 0.50.13<br>\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)<br>\n - Always extract page &amp;lt;title&amp;gt;, `{{watch_title}}` added to notification body tokens (#3415)<br>\n - UI - Correctly set &#39;checking now&#39; status badge on edit page<br>\n - Add noindex meta (#3416)<br>\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)<br>\n - Restock - Add &#39;nicht mehr lieferbar&#39; to stock status checks (#3410)<br>\n<br>\n - 0.50.12<br>\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)<br>\n - UI - Added &#34;unread&#34; view filter (#3393)<br>\n - Enable &#34;last_viewed&#34; field in the watch API. (#3403)<br>\n - Update docker-compose.yml - Include mac port info warning<br>\n<br>\n - 0.50.11<br>\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)<br>\n - Cryptography library - pinning version<br>\n - UI - Improving &#34;real-time updates offline&#34; message<br>\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397<br>\n - Update api-spec.yaml<br>\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)<br>\n - API Docs - Improve descriptions<br>\n - API Doc rebuild<br>\n - Bump API Docs slightly<br>\n - Update settings.html text<br>\n - API - Use OpenAPI docs (#3384)<br>\n - Refactor API Documentation (#3383)<br>\n - Updating API documentation<br>\n - Favicons in list - Prefer best/highest quality (#3351)<br>\n<br>\n - 0.50.10<br>\n - API - Recheck by tag #3356 (#3378)<br>\n - Cleanup empty queue messages Re #3376 (#3377)<br>\n<br>\n - 0.50.9<br>\n - Bump actions/checkout from 4 to 5 in the all group (#3373)<br>\n - Refactoring queue handling (#3363)<br>\n - Build - rPi - Cryptography lib not needed (#3365)<br>\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)<br>\n - Conditions &amp;amp; API - Fix set Conditions by API&nbsp;&nbsp;(#3349)<br>\n<br>\n - 0.50.8<br>\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)<br>\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)<br>\n - Re #3337 - UI - Various fixes for &#39;Extract Data&#39; (#3341)<br>\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321<br>\n<br>\n - 0.50.7<br>\n - UI - Set default favicon, handle default &#39;not set&#39; for new/updated installations<br>\n - UI - Set default favicon, offer option to disable favicons (#3316)<br>\n - README - Updating screenshot (with better cropping)<br>\n - README - Updating screenshot<br>\n - UI - Mobile CSS tweaks<br>\n - UI - Mobile - Small tidyups for mobile use<br>\n - UI - CSS - Modernising stylesheet build<br>\n<br>\n - 0.50.6<br>\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)<br>\n - Fixing ARMv7 docker image support for older devices (#3311)<br>\n - UI - Favicons - Try /favicon.ico if no other was specified in the document<br>\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime<br>\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.<br>\n - UI - Lazy load favicons so it doesnt block realtime and other operations<br>\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)<br>\n - UI - Sort list by Running or Paused #3284 (#3294)<br>\n - Similarity condition - Skip generating stats for very large documents in the &#39;Edit&#39; page (#3296)<br>\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the &#39;history&#39; page automatically (#3293)<br>\n - Update stock-not-in-stock.js Added &#39;backorder&#39; and &#39;more on order&#39;<br>\n - Update README.md<br>\n<br>\n - 0.50.5<br>\n - Update README-pip.md<br>\n - Update README.md<br>\n - Update README.md<br>\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)<br>\n - Conditions - Fixing &#34;Does NOT contain&#34; condition (#3279 / #3272 )<br>\n - Update README.md<br>\n - Update LICENSE<br>\n<br>\n - 0.50.4<br>\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list<br>\n - Better path cross-platform file handling (#3265)<br>\n<br>\n - 0.50.3<br>\n - Realtime UI - Prefer websocket then fallback to &#39;polling&#39; mode, increase reconnecting retries.<br>\n - UI - Fixing Watch &#39;set viewed&#39; by tag #3253 (#3258)<br>\n - UI - Always unset &#39;unviewed&#39; state when &#39;[History]&#39; button&nbsp;&nbsp;is pressed from watch overview list #3243<br>\n - UI - Tweak UI option text description for &#39;Open history page in new tab&#39; setting<br>\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)<br>\n - Realtime UI - Delete watch should update in realtime ( #3255 )<br>\n - UI - Quick watch add form color fix<br>\n - Application via HTTPS support -&nbsp;&nbsp;Adding SSL setup and automated test (#3247) (#3252)<br>\n - Browser Steps - Fix for `source:` URLs fix (#3254)<br>\n - UI - Restyle of &#34;quick watch add form&#34; above watchlist<br>\n - UI - Don&#39;t restrict page content box to 80% width (#3251)<br>\n - UI - #3236 fix duplicate icon in watchlist<br>\n - Data store - use original formatted data write<br>\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)<br>\n - UI - Realtime - Add realtime warning to page if server goes offline<br>\n - Browser Steps - Better support for sites that redirect on click/login etc<br>\n - Restock detector - Update texts (#3234)<br>\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)<br>\n - Build test - Build test for platforms in parallel (#3229)<br>\n - BrowserSteps - remove unsupported exception class<br>\n<br>\n - 0.50.2<br>\n - 0.50.1<br>\n<br>\n<br>\n - 0.50.01<br>\n - UI - Adding missing icons lib<br>\n - Use pip build cache from inside Dockerfile (#3228)<br>\n - UI - Also uncheck &#39;check all&#39; checkbox for group operations in realtime mode<br>\n - UI - Real time - checkbox operations now realtime without reload<br>\n - UI - Revert icon changes<br>\n - Building - Use GHA layer caching (#3227)<br>\n - UI - Realtime - Fixing &#39;last_changed&#39; status re #3224<br>\n - Realtime UI - Socketio tweaks and refactor (#3220)<br>\n - Code - Fix dep warning (#3221)<br>\n - Realtime UI - Reducing log output<br>\n - UI - Reword restock detector plugin description<br>\n - UI - Remove incorrect error text<br>\n<br>\n - 0.49.18<br>\n - Realtime UI updates via WebSocket (#3183)<br>\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)<br>\n - UI - Update &#39;Browser Steps&#39; UI text<br>\n - Code - Remove unused f-strings (#3209)<br>\n - Use logger.debug for playwright console logs (#3201)<br>\n<br>\n - 0.49.17<br>\n - Resolve warnings of bs4 library (#3187)<br>\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)<br>\n<br>\n - 0.49.16<br>\n - Fixes to ensure proxy errors are handled correctly (#3168)<br>\n - UI - Custom headers should have validation (#3172)<br>\n - Update selenium library (#3170)<br>\n - Restock detection - adding new string<br>\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)<br>\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)<br>\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)<br>\n - Improved global ignore test (#3140)<br>\n - Update docker-compose.yml (#3149)<br>\n - Small fix for xpath element scraper (#3145)<br>\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108<br>\n - Browser Steps - &amp;lt;Select&amp;gt; by Option Text - #1224, #1228 (#3138)<br>\n - Browser Steps - error reporting and session shutdown improvements (#3137)<br>\n<br>\n - 0.49.15<br>\n - Visual Selector &amp;amp; Browser Steps - Always recheck if the data/screenshot is ready under &#34;Visual Selector&#34; tab after using Browser Steps (#3130)<br>\n - App logs - Send TRACE and INFO logs to stdout (#3051)<br>\n - Development: introduce Ruff as linter/formatter (#3039)<br>\n - Updating restock texts (#3124)<br>\n - Only add screenshot warning if capture was greater than trim size (#3123)<br>\n<br>\n - 0.49.14<br>\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)<br>\n - docs: Update reference URL (#3119)<br>\n - UI - Fix to edit and groups template<br>\n - Updating API documentation<br>\n - Undo forced selenium headless mode, small refactor (#3112)<br>\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)<br>\n - Memory management -&nbsp;&nbsp;Run HTML to text in sub process, a few more cleanups&nbsp;&nbsp;to playwright (#3110)<br>\n - UI Edit/Stats - Add levenshtein distance info, explains how &#34;different&#34; the last two snapshot are (#3109)<br>\n<br>\n - 0.49.13<br>\n - API - Added notifications API endpoints (#3103)<br>\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)<br>\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)<br>\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)<br>\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)<br>\n - Update other methods to use updated screenshot handler (#3098)<br>\n - Memory fixes for large playwright screenshots (#3092)<br>\n - Filters - Support multi line regex&nbsp;&nbsp;(#2889)<br>\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)<br>\n - README.md update - Including blurb about &#39;conditions&#39;<br>\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)<br>\n - Make chrome browser headless when checking the site with selenium (#3095)<br>\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)<br>\n - UI - &#34;Recheck all&#34; should also queue most overdue first&nbsp;&nbsp;(same like automatic scheduler) (#3087)<br>\n - Groups - Including &#34;Extract text&#34;, &#34;Text to ignore&#34;, &#34;Trigger text&#34; and &#34;Text that should not be present&#34; filters<br>\n<br>\n - 0.49.12<br>\n<br>\n - 0.49.11<br>\n<br>\n - 0.49.10<br>\n - Update README.md<br>\n - UI - &#34;Conditions&#34; section, making the Conditions setup table work better on mobile/responsive<br>\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)<br>\n - Python 3.11 container base (#3077)<br>\n - Use lowercase static asset filenames<br>\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)<br>\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)<br>\n - Update edit.html - linking to tutorial<br>\n - Code - Tidy up lint errors (#3074)<br>\n - UI - Update edit.html- xPath support text for 1 &amp;amp; 2<br>\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)<br>\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)<br>\n - UI - Watch edit - &#34;Clone&#34; Should be &#34;Clone &amp;amp; Edit&#34; without watch history, redirect to the new edit page (#3063 #2782)<br>\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)<br>\n - UI - Tidy up support links<br>\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)<br>\n<br>\n - 0.49.9<br>\n - RSS Fixes and improvements - Ability to set &#34;RSS Color HTML Format&#34; in Settings, detect and filter content with bad content that could break RSS (#3055)<br>\n<br>\n - 0.49.8<br>\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)<br>\n - API - Adding &#34;Search&#34; API (#3052)<br>\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)<br>\n<br>\n - 0.49.7<br>\n - Adding Tags/Groups API (#3049)<br>\n<br>\n - 0.49.6<br>\n - API Access should still work even when UI Password is enabled (#3046) #3045<br>\n<br>\n - 0.49.5<br>\n - Template tidyup &amp;amp; UI Fixes (#3044)<br>\n - Watch history -&nbsp;&nbsp;Ensure atomic/safe history data disk writes (#3042 #3041)<br>\n - Testing - Replace Linux only &#39;resource&#39; library with cross-platform &#39;psutil&#39; library (#3037)<br>\n - Refactor code layout, add extra tests<br>\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc<br>\n<br>\n - 0.49.4<br>\n - Datastore - Always use utf-8 encoding for error text output storage<br>\n -&nbsp;&nbsp;Restock detection - Adding french keywords for out of stock items<br>\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied<br>\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)<br>\n - Browser Steps - Added new &#34;Make all child elements visible&#34; action<br>\n - Browser Steps - Added new &#34;Remove elements&#34; action<br>\n - UI - Browser Steps - &#34;Click X,Y&#34; should focus on the input field also<br>\n - UI - Browser Steps - Improving Browser Steps usability on mobile<br>\n<br>\n - 0.49.3<br>\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)<br>\n<br>\n - 0.49.2<br>\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)<br>\n - Update docker-compose.yml<br>\n - UI - More W3C HTML validation fixes<br>\n - UI - More W3C validation fixes (#2973)<br>\n - UI - Tweaks for HTML validation<br>\n - Filter - &#34;Unique lines&#34; could possibly crash if history was empty or cleared on the disk<br>\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers<br>\n - Removing deprecated docker-compose.yml version attribute (#2967)<br>\n - Update settings.html<br>\n - Browser Steps - Increasing timeout for actions and unifying timeout values<br>\n - Browser Steps - Fixing &#39;Uncheck checkbox&#39; #2958<br>\n - UI - &#34;Browser Steps&#34; tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)<br>\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)<br>\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)<br>\n<br>\n - 0.49.1<br>\n - Update stock-not-in-stock.js - Italian (#2948)<br>\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `&#34;Exception: No parsable JSON found in this document&#34; ` error) (#2947)<br>\n - Add major and minor tags for Docker release workflow (#2938)<br>\n - Adding jinja2/browsersteps test (#2915)<br>\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)<br>\n<br>\n - 0.49.00<br>\n - Update README.md<br>\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)<br>\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don&#39;t show an error was detected)(#2897)<br>\n<br>\n - 0.48.06<br>\n - Restock -&nbsp;&nbsp;Add test for new lower/higher price notification Re #2715 (#2892)<br>\n - Update integration test for &#34;linuxserver&#34; test build (#2891)<br>\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL&#39;s being double-encoded, fixes chantify:// notifications (#2868) (#2875)&nbsp;&nbsp;(#2870)<br>\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)<br>\n - &#34;Send test notification&#34; button - Easier to understand test send results, Improved error handling, code refactor (#2888)<br>\n - Improve `last_checked` vs `last_changed` time information precision (#2883)<br>\n - Update Apprise to 1.9.1 (#2876)<br>\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)<br>\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)<br>\n<br>\n - 0.48.05<br>\n - Fixing test for CVE-2024-56509 (#2864)<br>\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )<br>\n<br>\n - 0.48.04<br>\n - Windows was sometimes missing timezone data (#2845 #2826)<br>\n<br>\n - 0.48.03<br>\n - 0.48.02<br>\n - 0.48.02<br>\n - Notifications - &#34;Send test&#34; was not always following &#34;System default notification format&#34; (#2844)<br>\n - Notifications - &#34;Send test&#34; was not always following &#34;System default notification format&#34;<br>\n<br>\n - 0.48.02<br>\n - Notifications - &#34;Send test&#34; was not always following &#34;System default notification format&#34;<br>\n - Notifications - Default notification format (for new installs) now &#34;HTML color&#34; (#2843)<br>\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )<br>\n - Notifcations - Adding &#34;HTML Color&#34; notification format option (#2837)<br>\n - UI - Make &#39;tag&#39; sticky - redirect to current tag on edit or add watch (#2824 #2785)<br>\n - Notifications - Support for commented out notification URLs (#2825 #2769)<br>\n - Docs - Adding information to README.md about the new scheduler<br>\n<br>\n - 0.48.01<br>\n - UI - Fixing scheduler options<br>\n<br>\n - 0.48.00<br>\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)<br>\n - New functionality - Time (weekday + time) scheduler / duration (#2802)<br>\n - Add Turkish phrases for out-of-stock detection (#2809)<br>\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)<br>\n - Update stock-not-in-stock.js<br>\n - Python 3.13 compatibility (#2791)<br>\n - Code - Update .gitignore and .dockerignore (#2797)<br>\n - VisualSelector - Use &#39;deflate&#39; for storing elements.json, 90% file size reduction (#2794)<br>\n - UI - Show local timezone info in settings (for future functionality) #2793<br>\n - Notification - Locking paho-mqtt:// version fix<br>\n - Update COMMERCIAL_LICENCE.md<br>\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)<br>\n - Minor improvement for queue management<br>\n - Update bug_report.md<br>\n<br>\n - Security - Fix test<br>\n - Security check - improve test<br>\n - 0.47.06<br>\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set<br>\n - Update docker-compose.yml (#2767)<br>\n - Price tracker - fix for sites that supply an empty additional price (#2758)<br>\n - Testing - Pinning werkzeug (#2757)<br>\n<br>\n - 0.47.05<br>\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright<br>\n - Backups - Hide incomplete/running backups from being downloaded<br>\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)<br>\n - Filters - Process all CSS and XPath &#39;subtract&#39; selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)<br>\n<br>\n - 0.47.04<br>\n - Do not recheck &#39;paused&#39; watches on edit/save (Re #2747 #2750)<br>\n - Notification post:// get:// etc - Fixing URL encoding of headers so that &#39;+&#39; in URL is correctly parsed as &#39; &#39; (and other url-encodings) (#2745)<br>\n - #2502 - Add jinja2 template handling to request body and headers (#2740)<br>\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)<br>\n - &#34;Send test notification&#34; in &#34;Restock&#34; mode was not working correclty when restock tokens &#34;{{restock.price}}&#34; were in the notification body (#2737)<br>\n - #2727 Notifications - Fix &#34;send test notification&#34; on empty list, includes test (#2731)<br>\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)<br>\n - Filters - &#34;Block change detection when text exists&#34; should not trigger a change when the original text returns<br>\n - UI - More work on tab buttons hiding behind menu/header&nbsp;&nbsp;:-)<br>\n<br>\n - 0.47.03<br>\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)<br>\n - UI - Fix scroll offset / tab buttons hiding behind menu/header<br>\n - 0.47.02<br>\n - UI - Fix scroll offset / tab buttons hiding behind menu/header<br>\n<br>\n - 0.47.02<br>\n - UI - Fix scroll offset / tab buttons hiding behind menu/header<br>\n<br>\n - 0.47.01<br>\n - Adding missing `apprise_plugin` for pypi/pip based installs<br>\n<br>\n - 0.47.00<br>\n - Restock multiprice improvements (#2698)<br>\n - Test - Simple test for live preview<br>\n - Adding test for proxy checker/scanner (#2697)<br>\n - Fixing proxy checker (#2696)<br>\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)<br>\n - Testing - Tidyup (#2693)<br>\n - Filters &amp;amp; Text - Preview refactor/improvements (#2689)<br>\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)<br>\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header<br>\n - UI - Filters live preview - improvements to layout<br>\n - Restock - Use the scraped &#39;Not in stock&#39; product status over the metadata version (many website lie in the metadata) (#2684)<br>\n - UI - Better 40x error message (#2685)<br>\n - Visual Selector - Including &amp;lt;button&amp;gt; (#2686)<br>\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)<br>\n - Code - Small improvements in logging<br>\n - UI - CSS - Fix on sorting row wrapping issue (#2680)<br>\n - UI - Live filters preview - Better handling of watch preferences<br>\n - UI - &#34;Diff&#34; button in overview list is now &#34;History&#34; button (#2679)<br>\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)<br>\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters<br>\n - UI - Live filters preview - dark mode improvements<br>\n - UI - Improvements to text preview on mobile<br>\n - UI - Improvements to live preview of Filters text<br>\n - UI - Misc fixes for mobile styling (#2669)<br>\n - Update docker-compose.yml - Adding example for enabling change detection on local files<br>\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)<br>\n - UI - &#34;Filters &amp;amp; Triggers&#34; - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)<br>\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)<br>\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)<br>\n - Restock monitor - Only try to process restock information (like scraping for &#34;out of stock&#34; keywords) if the page was actually rendered correctly. (#2645)<br>\n - Text filters - Adding filters &#34;Trim whitespace&#34; and &#34;Remove duplicate lines&#34;<br>\n - Browser Steps - UI - Use a better flexbox layout<br>\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)<br>\n - Update AppRise notification library to 1.9.0 (#2624)<br>\n - browser_steps: add &#34;click element containing text if exists&#34; (#2629)<br>\n - Testing - Fixing Restock test #2641<br>\n - Testing - Fix false filter missing check alerts<br>\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)<br>\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)<br>\n - Small memory allocation fixes (#2625)<br>\n - Testing - locale fix for test (#2623)<br>\n - Testing/Code - Improving test reliability (#2617)<br>\n - UI - Hiding noisy info under &#39;show advanced help&#39; button (#2609)<br>\n<br>\n - 0.46.04<br>\n - Fixing restock monitor tests and tweaking docker default config example,<br>\n - Container name should be &#39;sockpuppetbrowser&#39; because its not just playwright that uses it<br>\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)<br>\n - Restock - updating texts and text offsets<br>\n - Build - Unpin jsonschema for faster builds (#2583)<br>\n - Price detection/scraping - Adding extra element training data (#2582)<br>\n<br>\n - 0.46.03<br>\n - Watch &#39;Download last snapshot&#39; link/button should give last, not first snapshot (#2576)<br>\n - Price and restock scraping - small price fix scraper (#2575)<br>\n - Browser Steps UI - Interactive UI wasn&#39;t sending headers but was when the check ran&nbsp;&nbsp;(#2551)<br>\n - Set encoding type for scraper script reader (#2574 #2568)<br>\n - Handle zero-byte/empty content responses with &#34;`[ ] Empty pages are a change`&#34; option, the same as when the HTML doesnt render any useful text (#2530)<br>\n<br>\n - 0.46.02<br>\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)<br>\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00c3\u00a9t\u00c3\u00a9 Fran\u00c3\u00a7aise du Radiot\u00c3\u00a9l\u00c3\u00a9phone (SFR) Support (#2524)<br>\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)<br>\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)<br>\n - Use #!/usr/bin/env to support virtualenv (#2518)<br>\n - Update README.md<br>\n - UI - Adding &#34;Download latest HTML snapshot&#34; from Edit Watch &amp;gt; Stats page for easier debugging (#2513)<br>\n<br>\n - 0.46.01<br>\n - UI - Fixing up &#39;test notification&#39; bug from main settings and tag settings pages #2510 (#2511)<br>\n<br>\n - 0.46.00<br>\n - Restock/Price detection - Improving text information snapshot value<br>\n - Restock - Tweaking storage of &#34;original price&#34;<br>\n - Fixing file:// file pickup&nbsp;&nbsp;- for change detection of local files (#2505)<br>\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)<br>\n - Dropping older ARM v6 support due to dependencies not having support (#2506)<br>\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)<br>\n - Restock &amp;amp; Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits<br>\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings<br>\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)<br>\n - UI - Restock/price following text cleanups<br>\n - UI - Extract &amp;lt;title&amp;gt; as title should work on all processors (#2490)<br>\n - Restock &amp;amp; Price monitor -&nbsp;&nbsp;Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list<br>\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)<br>\n - Update COMMERCIAL_LICENCE.md<br>\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software<br>\n - Adding COMMERCIAL_LICENCE.md<br>\n - Testing - Adding simple memory usage test (#2483)<br>\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)<br>\n<br>\n - 0.45.26<br>\n - Code - Fixing deprecation warning (#2477)<br>\n - UI - Visual Selector should still update when elements were not found (#2476)<br>\n - Code - Update/modernise diff.py (#2471)<br>\n - UI - Visual Selector - Multiple selections (refactor) (#2475)<br>\n - UI - Visual Selector now supports Shift+Click for multiple selections!<br>\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in &#34;CSS/JSONPath/JQ/XPath Filters&#34; include filters (#2440)<br>\n - UI - Visual Selector graphics should be centred<br>\n -&nbsp;&nbsp;Snapshot count from history was not updated in watch after using [clear history] (#2459)<br>\n - Fixing &#39;tags&#39;&#39; field from old installs (0.43.0+) could have wrong data-type causing crash<br>\n<br>\n - 0.45.25<br>\n - UI - Fixing preview/diff &#34;ignore text&#34; highlight button (refactor, didnt work in &#34;preview&#34; mode) (#2455)<br>\n - Restock detection - Updating detection texts<br>\n - UI - Mobile - Hiding empty columns<br>\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly<br>\n - Update docker-compose.yml - fix indentation re #2447<br>\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)<br>\n - Restock detection - updating texts<br>\n - UI - Fixing double punctuation in &#39;unpaused&#39; message #2435<br>\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)<br>\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)<br>\n - Filters - Implement jqraw: filter&nbsp;&nbsp;(use this to output nicer JSON format when selecting/filtering by JSON) (#2430)<br>\n - Build - fixing build warnings<br>\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt &#34;wheels&#34; for rPi devices, upgrade cryptography security library<br>\n - Prefer pythons built in &#34;importlib&#34; over pkg_resources+setuptools (#2424)<br>\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)<br>\n<br>\n - 0.45.24<br>\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)<br>\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on &#39;save&#39; (#2413)<br>\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)<br>\n - Improve testing for Python 3.10, 3.11 and 3.12<br>\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393<br>\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)<br>\n - Fetching/Requests - Fixing&nbsp;&nbsp;user agent header overrides per-watch of global settings (#2409)<br>\n - Code - improving unique key fix for history database handler (#2402)<br>\n - UI - &#39;Mark all viewed&#39; button should not show when all viewed (#2399)<br>\n - Fixing build test - Adding small delay (#2397)<br>\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)<br>\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393<br>\n - UI - Preview single snapshot - Date and button fixes (#2389)<br>\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)<br>\n<br>\n - 0.45.23<br>\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)<br>\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)<br>\n - Fix overflowing text<br>\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)<br>\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)<br>\n - Testing - Fixing JSON test<br>\n - UI - Mobile - quick watch form element fixes<br>\n - UI - CSS - Remove gradient border, it did not add much to the design #2377<br>\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)<br>\n - Notifications -&nbsp;&nbsp;Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)<br>\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)<br>\n - Browser Steps - Fixing &#34;goto site&#34; step #2330 #2337 (#2364)<br>\n - Crash on older CPU -&nbsp;&nbsp;Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )<br>\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint<br>\n - UI - Refactor of the Recheck Time Settings, Added &#34;Use default recheck time&#34; checkbox and refactor/simplify system handling (#2362)<br>\n - UI - Search should scan/search error messages (#2353)<br>\n - UI - &#39;stats&#39; tab should show what the server-type detected is ( #2348 )<br>\n - Update README.md<br>\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)<br>\n<br>\n - 0.45.22<br>\n<br>\n - 0.45.21<br>\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags<br>\n - UI - Error text on exception should contain the word Exception (#2322)<br>\n<br>\n - 0.45.20<br>\n - Bug fix - further work on&nbsp;&nbsp;lxml filter extract (#2313 #2312 #2317)<br>\n<br>\n - 0.45.19<br>\n - Bug fix for newer lxml module - module &#39;lxml.etree&#39; has no attribute &#39;_ElementStringResult&#39; - reimplement _ElementStringResult (#2313 #2312)<br>\n<br>\n - 0.45.18<br>\n - UI - Adding UI notice if watch has group options set (#2311 #2307)<br>\n - dependabot - automatically follow apprise<br>\n - &#34;Send Test Notification&#34; - In &#34;Group&#34; settings form it should not fallback to the system wide notifications when sending a test if nothing is set.<br>\n - &#34;Send Test Notification&#34; - Now provides better feedback and works with the actual values in system settings form<br>\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)<br>\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243<br>\n - UI - Remove unique check for URLs entered on the &#34;quick watch add&#34; form ( #2286 #2292 )<br>\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)<br>\n - &#34;Send Test Notification&#34; button&nbsp;&nbsp;from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )<br>\n<br>\n - 0.45.17<br>\n - UI - Add helper note<br>\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters<br>\n - Update contributing documentation for discontinuation of `dev` branch (#2272)<br>\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)<br>\n - Notifications - Updating apprise version, pinning&nbsp;&nbsp;mqtt:// to compatible version (#2242)<br>\n<br>\n - 0.45.16<br>\n - Pip build - content fetchers package was missing<br>\n<br>\n - 0.45.15<br>\n - Updating restock detection texts<br>\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)<br>\n - UI - Overview list shortcut button - Ability to reset any previous errors<br>\n - Chrome Extension - Adding link and install information from the API page<br>\n - Chrome Extension - Adding link in README.md to the webstore<br>\n - Chrome Extension - Adding callout to UI<br>\n - Import - Fixed &#34;Include filters&#34; option (fixed typo on select) (#2232)<br>\n - Updating restock detection texts<br>\n - Restock detection - Improving test for restock IN STOCK -&amp;gt; OUT OF STOCK (#2219)<br>\n - Puppeteer - remove debug hook<br>\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )<br>\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)<br>\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible<br>\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper<br>\n - Fetching - Puppeteer - Adding more debug/diagnostic information<br>\n - Update stock-not-in-stock.js<br>\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)<br>\n - Code - Remove whitespaces in visual selector elements config<br>\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)<br>\n - Update stock-not-in-stock.js<br>\n - Fetching pages - Custom browser endpoints should not have default proxy info added<br>\n - Puppeteer - fixing wait times<br>\n - Puppeteer - more improvements to proxy and authentication<br>\n - Puppeteer - client fixes for proxy and caching (#2181)<br>\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)<br>\n - Puppeteer fetch - fixing exception names<br>\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)<br>\n - Alpine linux build - adding JPEG development headers to fix build errors<br>\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)<br>\n - Fetching - Prefer to use SockPuppetBrowser (#2163)<br>\n<br>\n - 0.45.14<br>\n - Bug fix -&nbsp;&nbsp;fix missing default var (#2162/ #2118/ #2122 )<br>\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)<br>\n - Restock detection - Update stock-not-in-stock.js (NL)<br>\n - New text filter - Sort text alphabetically filter (#2153)<br>\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)<br>\n - Record notification count and show in [stats] tab (#2150)<br>\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)<br>\n - UI - Show error/warning when trying to compare the same version<br>\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)<br>\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565<br>\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)<br>\n - Testing - General test workflow improvements (#2144)<br>\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)<br>\n - Notifications - skip empty notification URLs from being processed (#2138)<br>\n - UI - Filters &amp;amp; Triggers - Adding example for keyword matching in a line<br>\n - RSS - Adding performance stats<br>\n - Notification - logging - adding performance information for processing time of notifications #327<br>\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)<br>\n - Logging - Adding extra debug logging to change detection (#2136)<br>\n - Fetcher -&nbsp;&nbsp;Improve status_code logging (#2130 #2122)<br>\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)<br>\n - Restock tweaks - use a single regex, tidy up height detection (#2125)<br>\n - Notification - Templates - Adding an example of how to use URL encoding with tokens<br>\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads<br>\n - Build maintenance&nbsp;&nbsp;- dependabot - Bump the all build helpers (#2121)<br>\n - Enable dependabot for github-actions (#2119)<br>\n - Update docker-compose.yml<br>\n<br>\n - 0.45.13<br>\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/&amp;lt;uuid&amp;gt;/history` @rozpuszczalny<br>\n - Test - tidy up backup test (#2117)<br>\n - Adding contributors section (#2116)<br>\n - Logging loguru output tweaks (#2112)<br>\n - Support Loguru as a logger (#2036)<br>\n - Update stock-not-in-stock.js texts<br>\n - Test - Adding extra test for HTML output in emails ( #2103 )<br>\n - Update README.md<br>\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)<br>\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)<br>\n - Browser Steps - Fixing &#34;&#39;Response&#39; object is not subscriptable&#34; where quotes were used in connection URL&nbsp;&nbsp; - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)<br>\n - Added OPTIONS HTTP method (#2094)<br>\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)<br>\n<br>\n - 0.45.12<br>\n - 0.45.11<br>\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)<br>\n - Update README.md<br>\n - Removing heroku support as its no longer free<br>\n - PyPi package build fixes (#2084)<br>\n - Adding PyPi pip package publisher script<br>\n<br>\n - 0.45.10<br>\n - Update README.md - Remove deprecated docker-compose (now docker compose)<br>\n - Browser Steps - General error handling improvements (#2083)<br>\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)<br>\n - UI - [Send test notification] - Refactor to use all tokens&nbsp;&nbsp;like a real watch and Notification Body+Title from UI value (#2079)<br>\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support.&nbsp;&nbsp;(#2075)<br>\n - Restock detection - &#34;In stock&#34; should be None/&#34;Not yet checked&#34; by default (#2069)<br>\n - Restock detection - updating texts<br>\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don&#39;t switch to custom puppeteer mode if external browser URL is active (#2068)<br>\n<br>\n - 0.45.9<br>\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)<br>\n - Testing: Improve application signal handling test coverage (#2052)<br>\n - Update docker-compose.yml<br>\n - Restock detection - Update stock-not-in-stock.js strings (#2032)<br>\n - API - Updating documentation<br>\n - Update README.md<br>\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)<br>\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)<br>\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)<br>\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser<br>\n<br>\n - 0.45.8.1<br>\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)<br>\n - UI - Fix - Edit Watch &#39;Show advanced options&#39; should fire at page load to show you whats possible<br>\n<br>\n - 0.45.8<br>\n - Restock detector - adding more detection strings<br>\n - UI - remove incorrect label<br>\n - UI - &#34;Add new watch&#34; URL at main input box should always grow to match the viewport<br>\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)<br>\n - UI - &#39;Request body&#39; section disappears after switching from &#39;Playwright&#39; to &#39;System settings default&#39; and back on &#39;Request&#39; tab - Fixed #1449<br>\n - Browser Steps - Adding validation for &#34;Click X,Y&#34; step<br>\n - API - Make sure the watch &#34;is viewed&#34; attribute is correctly represented in the API output (#2009)<br>\n - Update playwright fetcher library and API calls<br>\n - Testing - Improve PDF text change detection tests (#1992)<br>\n - UI - Clicking the &#34;[Diff]&#34; link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)<br>\n - Visual Selector - xPath handling misc fixes (#1976)<br>\n - Fix build issue<br>\n - feature: Support XPath2.0 to 3.1 (#1774)<br>\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using &#34;scraping browsers&#34;/&nbsp;&nbsp;etc) (#1943)<br>\n - API/UI - Button to regenerate API key (#1975 / #1967)<br>\n - Code refactor for fetchers (#1941)<br>\n<br>\n - 0.45.7.3<br>\n - Build - update docker container cache setup<br>\n<br>\n - 0.45.7.2<br>\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)<br>\n - Revert &#34;Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)&#34; (#1964)<br>\n<br>\n - 0.45.7.1<br>\n - Build: python libraries - pinning more libraries (#1962)<br>\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)<br>\n - Pip builder - ignore proxy test data if it exists<br>\n<br>\n - 0.45.7<br>\n - UI - Fixing issue where search box JS interfered with page render when logged out<br>\n<br>\n - 0.45.6<br>\n - UI - Adding support-us widget &amp;lt;3 (#1956)<br>\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)<br>\n - Update README.md - Adding import information<br>\n - Upgrade playwright browser library (#1942)<br>\n - Update docker-compose.yml - playwright version should be the same as in the automated tests<br>\n - Import - Improved Wachete Excel XLS import support for &#34;dynamic wachet&#34; (sets correct state of using chrome browser or not) column (#1934)<br>\n - Refactor Excel / wachete import, extend tests (#1931)<br>\n - Build - Upgrading pip packages (#1915)<br>\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)<br>\n - Docker build - upgrade image to &#34;bookworm&#34; debian version - fix glibc mismatch (#1918)<br>\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)<br>\n - Nice format stats (comma sep)<br>\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)<br>\n<br>\n - 0.45.5<br>\n - BrowserSteps - Wrong text taken from browser steps&nbsp;&nbsp;(#1911)<br>\n<br>\n - 0.45.4<br>\n - Code cleanup - Browser Steps<br>\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)<br>\n - Text Filters - &#34;Extract Text&#34; filter was not being error checked properly when using a RegEx (#1902)<br>\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)<br>\n - UI - &#34;With errors&#34; tag/button should always show the current tag error count<br>\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)<br>\n - Upgrade selenium to 4.14.0 (latest) (#1783)<br>\n - UI - Don&#39;t show search icon when logged out (#1896)<br>\n - UI - Adding handy &#34;limit to watches with errors&#34; button (#1886)<br>\n - UI - Viewing text differences - Tweaks to &#34;Jump to next change&#34; button<br>\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)<br>\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)<br>\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868<br>\n - UI - Adding [stats] tab to watch Edit page (#1880)<br>\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)<br>\n - RSS fetch - RSS field &amp;lt;title&amp;gt; was not rendering as text correctly, added workaround #1879<br>\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)<br>\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)<br>\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)<br>\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860<br>\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style<br>\n - Testing - Improve xPath tests (#1863)<br>\n - UI - Fixing jump to next difference button after refactor<br>\n - UI - Updating proxy tip link<br>\n - UI - Adding watch label/title to [edit] page title (#1858)<br>\n - Documentation - Add note that playwright is not supported on ARM type devices #1856<br>\n - UI - Difference page - added &#39;title&#39; to each change for nice mouse-over information about when the change occured<br>\n - UI - Difference page - Tweak &#39;preview&#39; page invite text<br>\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)<br>\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find<br>\n - System - No need to run updates on fresh installs (#1854)<br>\n - UI - Proxy configuration helper notes improvements<br>\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)<br>\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies<br>\n<br>\n - 0.45.3<br>\n - Update README-pip.md<br>\n - Update README.md<br>\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)<br>\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)<br>\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)<br>\n - Update README.md<br>\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser<br>\n - BrowserSteps - &amp;lt;input&amp;gt; of type &#39;number&#39; should use &#39;enter text in field&#39;<br>\n - Restock detect - bumping texts for restock detection<br>\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image<br>\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)<br>\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)<br>\n - Building application - Upgrade test workflows to latest versions (#1817)<br>\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)<br>\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)<br>\n - UI - More precise text to describe &#34;current_snapshot&#34; notification token<br>\n<br>\n - 0.45.2<br>\n - Code/Test - Improve testing for creating backups<br>\n - UI - Re-order notification field settings<br>\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link<br>\n - UI - Notifications - Tweak discord help text<br>\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)<br>\n - UI - &#34;recheck all&#34; button should ignore blank/empty &#34;tag&#34; setting when set<br>\n - Update README.md<br>\n - UI - Fix spelling error<br>\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)<br>\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)<br>\n - Ability to select &#34;No proxy&#34; for a watch when you have proxy&#39;s configured<br>\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)<br>\n - Update README.md<br>\n - UI - Fixing update for sort by &#34;date created&#34; or &#34;#&#34; in watch overview table ( #1775 )<br>\n - Add &#39;diff_patch&#39; notification body token - This will allow the diff to be generated in the &#34;unified patch format.&#34; (#1765)<br>\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)<br>\n<br>\n - 0.45.1<br>\n - UI - Fixing open/broken HTML which was causing some buttons to not display<br>\n<br>\n - 0.45<br>\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)<br>\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)<br>\n - Fix - Regular Expression text in&nbsp;&nbsp;`ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)<br>\n - Fix typo in README.md (#1759)<br>\n - UI - &#34;Test notification&#34; button in &#34;Group Tag&#34; settings page was broken due to missing variable #1753<br>\n - UI - Clicking &#39;ignore text&#39; when highlighting text should clear the preview text button/area. #1754<br>\n - Update documentation - How to set number of concurrent fetchers<br>\n<br>\n - 0.44.2<br>\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)<br>\n - Update README.md<br>\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)<br>\n - Updating in app links<br>\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like &#34;localhost&#34; with BLOCK_SIMPLEHOSTS setting (#1732)<br>\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)<br>\n<br>\n - 0.44.1<br>\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)<br>\n - UI - Fixing darkmode switch icon<br>\n<br>\n - 0.44<br>\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.<br>\n - API - Updating API description for handling a single watch<br>\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems<br>\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)<br>\n - Browser Steps - When cleaning up old screenshots, check the file exists<br>\n - Scan/Recheck proxies - Report filter not found as &#34;OK&#34; but with warning<br>\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)<br>\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)<br>\n<br>\n - 0.43.2<br>\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)<br>\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)<br>\n<br>\n - 0.43.1<br>\n - Bug fix - Notification settings were not cascading from global -&amp;gt; tags -&amp;gt; watch correctly in some cases (#1654)<br>\n - Bug - Fix watch clone (#1647)<br>\n - UI - Dont allow empty tag names (#1641)<br>\n<br>\n - 0.43<br>\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox<br>\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups<br>\n - UI - Fixes to dark mode toggle (#1629)<br>\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)<br>\n - Code - Adding CI test for search (#1626)<br>\n<br>\n - 0.42.3<br>\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)<br>\n - README - Update links to new website<br>\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)<br>\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)<br>\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)<br>\n - UI/Fetching - Update &#34;Filter not found&#34; message to be more explanatory/helpful (#1602)<br>\n - Restock monitor - Updating texts for tickets available/unavailable restock detection<br>\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)<br>\n<br>\n - 0.42.2<br>\n - UI - Configurable pager size #1599 #1598<br>\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 )<br>\n - Restock detection - Better reporting when it fails (#1584)<br>\n - Fetcher - Puppeteer experimental fetcher wasn&#39;t returning the status-code (#1585)<br>\n - Update README.md<br>\n<br>\n - 0.42.1<br>\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)<br>\n<br>\n - 0.42<br>\n - UI - &#34;Search List&#34; also works for &#39;Title&#39; field<br>\n - UI - New &#34;Search List&#34; icon and functionality (#1580)<br>\n - VisualSelector - Add message when first version cannot be found<br>\n - UI - update link to official project page<br>\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)<br>\n - BrowserSteps - Support for float seconds (0.5 etc)<br>\n - BrowserSteps - Session keep alive timer countdown fix<br>\n - BrowserSteps - adding setup check<br>\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors<br>\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a &amp;lt;div&amp;gt; or other<br>\n - Fetcher - Experimental fetcher - dont cache embedded data URLs<br>\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)<br>\n - BrowserSteps - Include nice big start button SVG<br>\n - BrowserSteps - Remove unreliable method for detecting if the element has a &#34;click&#34; listener and default to click (switch to &#39;Click X,Y&#39; will return the right co-ords anyway)<br>\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)<br>\n - UI - Adding shortcut list select button for &#34;clear/reset history&#34;<br>\n - Fetcher - Experimental fetcher fixes, now only enabled with &#39;USE_EXPERIMENTAL_PUPPETEER_FETCH&#39; env var (default off) (#1561)<br>\n - UI - Adding shortcut list select button for &#34;clear/reset history&#34;<br>\n - Element scraper - wrap offset detection in try/catch<br>\n - BrowserSteps - BrowserSteps was not always following proxy information<br>\n - BrowserSteps - remove minor delay<br>\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)<br>\n - UI - Fix back navigation / browser history (#1556)<br>\n - UI - HTML validation improvements for edit forms (#1553)<br>\n - UI - Various minor HTML validation fixes<br>\n - UI - pagination - use count including tag filter for pagination display<br>\n - UI - Notifications - Adding icon to &#34;Add Email&#34; button<br>\n - UI - Adding pagination to watch list (#1549)<br>\n - UI - Set selected watches as &#39;viewed&#39; (#1550)<br>\n - UI - Fix missing &amp;lt;/span&amp;gt; in watch list when using restock detection<br>\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)<br>\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)<br>\n - Adding generic changedetection.io SVG icon #1527<br>\n - Tests - error test - be sure to clear results from other test parts<br>\n - Update README.md<br>\n - Tests - Add test to check that low level fetch errors are cleared on next check<br>\n - Restock alerts - adding extra detection texts<br>\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)<br>\n - Automated CI test for ensuring pypi package was built correctly (#1488)<br>\n<br>\n - GitHub container build - &#39;provenance&#39; was disabled<br>\n - 0.41.1<br>\n - Fix for pip installations<br>\n<br>\n - 0.41<br>\n - Notifications - Include triggered text token as&nbsp;&nbsp;`{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)<br>\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also<br>\n - Quick add form - adjust font size and rename stock recheck<br>\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)<br>\n - Restock / stock / out of stock monitor - bumping detection texts<br>\n - Use brotli for reducing the size of the text snapshots (#1482)<br>\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)<br>\n - New feature - Restock / stock / out of stock monitor option/mode<br>\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.<br>\n - Update README.md<br>\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)<br>\n - BrowserSteps - Adding `Goto URL` step<br>\n - Fixing bad linebreak definition `&amp;lt;/br&amp;gt;` in notifications and UI (#1465)<br>\n - Notification Improvements - New tokens `{{diff_added}}` and&nbsp;&nbsp;`{{diff_removed}}`, removed whitespace around `added` and `into`&nbsp;&nbsp;( Issue #905 ) (#1454)<br>\n - Update README.md<br>\n<br>\n - Bug - False change alerts - code cleanups Re #962 (#1444)<br>\n - Update README.md<br>\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)<br>\n - False change alerts fix - Don&#39;t reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)<br>\n - Library update - Replace bs4 with beautifulsoup4 (#1433)<br>\n - API - Including `last_changed` timestamp in watch API info (#1436)<br>\n - Update apprise to 1.3.0 (#1430)<br>\n - API documentation - improving example for list watches<br>\n - API documentation - improving example for snapshot history<br>\n - API - Adding current version to &#39;System Information&#39; endpoint, bumping API docs, Re #1429<br>\n - Further improving API documentation Re #1426<br>\n - Improving API documentation Re #1426<br>\n - Browser Steps - Adding &#34;Wait for text&#34; and &#34;Wait for text in element&#34; Re #1427<br>\n - Re #1382 - UI fix - sorting now works with selected tag<br>\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)<br>\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same&nbsp;&nbsp;(#1410)<br>\n - Deleting a watch now removes the entire watch storage directory (#1408)<br>\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)<br>\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393<br>\n - Remove unused code (#1394)<br>\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot<br>\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389<br>\n<br>\n - 0.40.2<br>\n - Code cleanup - remove unused import<br>\n - UI fix - Fix logic for showing screenshot on diff page (#1379)<br>\n - Re #1365 - Playwright - Browser &#34;Service Workers&#34; should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)<br>\n - New setting to allow passwordless access to your &#39;diff&#39; page - perfect for sharing your diff page securely, refactored login code (#1357)<br>\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)<br>\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)<br>\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)<br>\n - Fix fetch UI default fetch backend option icon (#1343)<br>\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)<br>\n<br>\n - 0.40.1.1<br>\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)<br>\n<br>\n - 0.40.1.0<br>\n - Update README.md<br>\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079<br>\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)<br>\n - Ability for watch to use a more obvious system default fetcher (#1320)<br>\n - Update README.md<br>\n - pip - eventlet doesnt support dnspython &amp;gt;=2.3.0 (Fixes build error)<br>\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)<br>\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)<br>\n - Data storage - Don&#39;t recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)<br>\n - UI: Updating queued success message (#1285)<br>\n - README.md - Fix release link (#1277)<br>\n - Notifications: updating apprise (slack notification fixes and others) (#1272)<br>\n - Remove docker-compose version so it works on any modern version #1144 (#1268)<br>\n - Update the docker compose file to any version (#1079) (#1144)<br>\n - IPv6 support for listening on (#1267)<br>\n - Test improvements (#1264)<br>\n<br>\n - 0.40.0.4<br>\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)<br>\n - Filters &amp;amp; Notifications - fixed tokens in filter not found notification<br>\n - UI - Fix broken html tags in settings page<br>\n - Proxy Settings in UI - TidyUp BrightData text<br>\n - Ability to configure extra proxies via the UI (#1235)<br>\n - Docker container updates - use Python 3.10, remove unused packages<br>\n - Tidy up list icons a bit (#1250)<br>\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)<br>\n - Testing - Run test as fully built docker container (#1245)<br>\n - Dark mode - system setting var is not required (its cookie based)<br>\n<br>\n - 0.40.0.3<br>\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements<br>\n - Fetching - Check the most overdue watch first (#1242)<br>\n - Overview list - Checkbox action &#34;Recheck&#34;<br>\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)<br>\n - Fetching - Always sort the key order of JSON content for less false alerts&nbsp;&nbsp;(May cause an alert on upgrade, but will be better going forwards) #1219<br>\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder<br>\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)<br>\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers<br>\n - Improve ARM/rust build comment<br>\n - README.md - Improving JSONPath example for LD+JSON product data<br>\n<br>\n - 0.40.0.2<br>\n - Price follower - Dont scan for ldjson data when &#39;no&#39; was clicked on the suggestion (#1207)<br>\n - Adding missing parts for pip build Re #1206<br>\n<br>\n - 0.40.0<br>\n - VisualSelector - Exclude items that are not interactable or visible<br>\n - Automatically offer to track LD+JSON product price data (#1204)<br>\n - UI - favicon callback no longer needed<br>\n - Test cleanups (#1196)<br>\n - Update runtime.txt (#1198)<br>\n - Dark mode - HTML template tidy up (#1197)<br>\n - UI - watch tags also known as watch tag / label<br>\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly<br>\n - Extract data - minor improvement to example<br>\n - Darkmode - Pause/Mute notification colour fix, re #1195<br>\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)<br>\n - Notifications - tokens/jinja2 templating (#1184)<br>\n - Dark mode - more colour fixes<br>\n - Test improvement - improving notification error network test<br>\n - Extract text as CSV - Extra validation (#1192)<br>\n - Dark mode - make watch list easier to read when theres &#39;unviewed&#39; entries<br>\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)<br>\n - UI - Cursor over labels should be pointer<br>\n - Dark mode - Make watches with errors easier to read<br>\n - Dark mode - cookie path should be all site<br>\n - Tweaks - adding hover/title to dark mode button<br>\n - UI - Dark Mode (#1187)<br>\n - docker-compose - Add playwright/selenium container dependencies example (#1178)<br>\n - BrowserSteps - Can be shared by the watch share link<br>\n - UI - Make tabs hoverable<br>\n - Favicon multiplatform and path fix/update (#1176)<br>\n - BrowserSteps - Cleanup interface on shutdown<br>\n - BrowserSteps - More work on cleaner shutdowns of browser session<br>\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown<br>\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)<br>\n - BrowserSteps - Use correct mimetype for screenshot update<br>\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)<br>\n - BrowserSteps - Add &#39;Execute JS&#39; step<br>\n - BrowserSteps - Also try to find clickable div/spans<br>\n - Update README.md<br>\n - Update README.md<br>\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset<br>\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169<br>\n - Extra validation for URLs with template markup (#1166)<br>\n - Browser Steps - adding &#39;please wait&#39; text while loading<br>\n - Re #1163 psutil missing from pip requirements<br>\n - Update README.md<br>\n - Update README.md<br>\n - VisualSelector &amp;amp; BrowserSteps - Scraper improvements, remove duplicate code<br>\n - Bumping VisualSelector example animation<br>\n - Remove dupe xpath finder prep code<br>\n - Browsersteps &#39;Beta&#39; label image path fix<br>\n - Configurable &#34;Browser Steps&#34; when Playwright/Chrome is configured&nbsp;&nbsp;(enter text, scroll, wait for text, click button etc) (#478)<br>\n - Update README.md -&nbsp;&nbsp;Make docker instructions easier to follow on Windows&nbsp;&nbsp;(#1158)<br>\n<br>\n - 0.39.22.1<br>\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)<br>\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly<br>\n - Update README.md<br>\n - Update README.md<br>\n<br>\n - 0.39.22<br>\n - Fix dangling HTML tag from screenshot notification<br>\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot,&nbsp;&nbsp;(#1140)<br>\n - Minor test improvements<br>\n - Option to attach screenshot to notification (#1127)<br>\n - VisualFilter - check previously set filters were set before highlighting<br>\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.)<br>\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)<br>\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)<br>\n - Make link to notification debug log easier to find (#1130)<br>\n - Bump notification library (#1128)<br>\n - Re #1126 HIDE_REFERER setting had wrong default<br>\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use &#39;False&#39; (#1121)<br>\n - Stability fix related to the new watch check count (#1113)<br>\n - Use deepcopy to stop possible data corruption (#1108)<br>\n - Code- Use dict .get instead of key<br>\n - Adding a check counter to watch fetching (#1099)<br>\n - Update README.md<br>\n - HIDE_REFERER incompatible with password based login, added comment to code #996<br>\n - Update README.md<br>\n - Filters can now accept a list/multiple filters (#1064) #623<br>\n<br>\n - 0.39.21.1<br>\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)<br>\n<br>\n - 0.39.21<br>\n - Disable version check when pytest is running (#1084)<br>\n - Removing unused code (#1070)<br>\n - Docker &amp;amp; python - Jq conditional pip requirements.txt include (Don&#39;t install in Windows because theres no Windows library/wheel)<br>\n - Docker &amp;amp; python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)<br>\n - UI - Make fetch error more readable (#1038)<br>\n - Update README.md<br>\n - Re #1052 - Watch &#39;open&#39; link should use any dynamic/template info (#1063)<br>\n - Remove accidental files<br>\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation<br>\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)<br>\n - API - system info - allow 5 minutes grace before watch is considered &#39;overdue&#39;<br>\n - API - Adding basic system info/system state API (#1051)<br>\n - Build - Fix syntax in container build test (#1050)<br>\n - Building - Test container build on PR<br>\n - Testing - Use same version of playwright while running tests as in production builds (#1047)<br>\n - update path for validation in the CONTRIBUTING.md (#1046)<br>\n - History index safety check - Be sure that only valid history index lines are read (#1042)<br>\n - Option to Hide the Referer header from monitored websites. (#996)<br>\n<br>\n - 0.39.20.4<br>\n - Better cross platform file handling in diff and preview (#1034)<br>\n<br>\n - 0.39.20.3<br>\n - Windows - diff file handling improvements (#1031)<br>\n - Also include tests in pip build<br>\n - Update README.md<br>\n<br>\n - 0.39.20.2<br>\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)<br>\n - Adding test - Test the &#39;execute JS before changedetection&#39; (#1006)<br>\n<br>\n - 0.39.20.1<br>\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)<br>\n - Adding `make` to Dockerfile build as required by jq for ARM devices<br>\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)<br>\n<br>\n - 0.39.20<br>\n - Adds support for jq JSON path querying engine (#1001)<br>\n - Adding link to BrightData Proxy info (#1003)<br>\n - Remove quotationspage default watch<br>\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)<br>\n - Selenium fetcher - screenshot should be taken after &#39;wait&#39; time, not before #873<br>\n - Upgrade Playwright to 1.26<br>\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958<br>\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing &#34;Unable to retrieve content because the page is navigating and changing the content.&#34; on some sites<br>\n - Tidy up proxies.json logic, adding tests (#955)<br>\n - Update README.md - Include BrightData suggestion<br>\n - Improve Proxy minimum time debug output<br>\n - Default proxy settings fixes<br>\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)<br>\n - Upgrade Playwright to 1.25<br>\n - Update README.md<br>\n<br>\n - 0.39.19.1<br>\n - Notification - code tidyup<br>\n - Watch list &amp;amp; notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default<br>\n - Notification - Reset defaults button should be on edit page only<br>\n - Notification watch settings - add button to make watch use defaults (empties the settings)<br>\n - Notification system update - set watch to use defaults if it is the same as the default<br>\n - Fix typo (#924)<br>\n<br>\n - 0.39.19<br>\n - Update README.md<br>\n - Tweaks to python PIP readme<br>\n - Use play and pause separate icons (#919)<br>\n - Further notification settings refinement (#910)<br>\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)<br>\n - repair pip readme<br>\n - Test improvement - Visual selector data loads as JSON (#895)<br>\n - Cleaner separation of watch/global notification settings (#894)<br>\n - Code maintenance - Removing old function (#875)<br>\n - Show screenshot age in [preview]<br>\n - Update README.md<br>\n - Update README.md<br>\n - Update README.md<br>\n - Update bug_report.md<br>\n - Update bug_report.md<br>\n - Update README.md<br>\n<br>\n - 0.39.18<br>\n - More data saving pre-checks (#863)<br>\n - Update screenshot<br>\n - Checkbox operations - reorder buttons for safety<br>\n - UI feature - Basic checkbox/group operations (#861)<br>\n - Bug fix - automatically queued watch checks weren&#39;t always being processed sequentially<br>\n - Playwright - Support proxy auth mechanisms (#859)<br>\n - Update README.md<br>\n - Update README.md<br>\n - Skip processing when watch was deleted<br>\n - Playwright fetcher didn&#39;t report low level HTTP errors correctly (like Connection Refused) (#852)<br>\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)<br>\n - Visual selector data not being saved by refactor<br>\n - &#39;Save chrome screenshot&#39; checkbox never used, removing, we always save the screenshot. (#844)<br>\n - Crash fix: Data store sub-directories werent always being created when needed (#842)<br>\n - Make the table header easier to understand when sorting (#840)<br>\n - Column sorting (#838)<br>\n - Update README.md<br>\n - Revert &#34;don&#39;t process paused entries after queue&#34;, so we can still manually recheck a paused watch<br>\n - Remove &#39;last-changed&#39; from url-watches.json and always calculate from history index (#835)<br>\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies<br>\n - Execute JS should happen after waiting seconds<br>\n - Upgrade playwright python driver (#834)<br>\n - Crash protection - handle the case where watch was deleted while being checked (#833)<br>\n - Don&#39;t process a watch if it was paused after being queued (#825)<br>\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)<br>\n - Remove social links for now<br>\n<br>\n - 0.39.17.2<br>\n - Test fix - Remove debug from test<br>\n - Security update -&nbsp;&nbsp;Password could be unset from settings form unexpectedly (#808)<br>\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes<br>\n - Handle SIGTERM for cleaner shutdowns (#737)<br>\n - Remove [save &amp;amp; preview] button, the preview is not updated live so it can lead to confusion (#801)<br>\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)<br>\n - [preview current] cleanup code and add test<br>\n - Feature - mute notifications (#791)<br>\n - Test improvement - remove unnecessary step<br>\n<br>\n - 0.39.17.1<br>\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)<br>\n - README.md - new Discord invite link<br>\n<br>\n - 0.39.17<br>\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit<br>\n - UI Feature - Add watch in &#34;paused&#34; state, saving then unpauses (#779)<br>\n - Enhancement - support xPath text() function filter, for example &#34;//title/text()&#34; in RSS feeds (#778)<br>\n - Bug fix - Filter &#34;Only trigger when new lines appear&#34; should check all history, not only the first item (#777)<br>\n - Visual Selector direct element finder fix<br>\n - Update README.md<br>\n - Update README.md links<br>\n - Filter failure notification send default enable now controlled by setting Env var<br>\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)<br>\n - Update README.md - adding LinkedIn link<br>\n - Update README.md - Adding Discord and YouTube links<br>\n - Bug fix for alerting when xPath based filters are no longer present (#772)<br>\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)<br>\n - mailto plaintext handling fix for &#39;plaintext&#39; apprise integration<br>\n - Minor code cleanups<br>\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)<br>\n - Form text tweak - Regex clarification (#766)<br>\n - Update README.md<br>\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)<br>\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL<br>\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)<br>\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)<br>\n - remove extra file<br>\n - removing package-lock.json - not required to be in git<br>\n - Share-icon cleanups<br>\n - Test improvement: Extract text should return all matches<br>\n - Bug fix: RSS Feed should also announce utf-8 charset<br>\n - Regex extract filter: Return all regex results instead of first match (#730)<br>\n - Ability to specify JS before running change-detection (#744)<br>\n - Playwright - log console errors to output<br>\n - UI Improvement - Clarifying &#34;Visual Filter&#34; tool as &#34;Visual Selector Filter&#34;<br>\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)<br>\n - Update docker-compose.yml&nbsp;&nbsp;- Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)<br>\n<br>\n - 0.39.16<br>\n - Fix notification apprise application name to changedetection.io #731<br>\n - Update README.md<br>\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)<br>\n - Playwright - Use HTTP Request Headers override (Cookie, etc)<br>\n - lang: prefer &#39;clear (snap) history&#39; to &#39;scrub&#39; (#721)<br>\n - Minor diff page improvements - list should be sorted &#39;newest first&#39; and no need to include the current version to compare against (#716)<br>\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705<br>\n - Update README.md<br>\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)<br>\n - New filter - Block change-detection if text matches - for example, block change-detection while the text &#34;out of stock&#34; is on the page, know when the text is no longer on the page (#698)<br>\n - Docker containers - :latest is now stable release, :dev is now master/nightly<br>\n - Trigger filters improvement- it&#39;s possible some changes weren&#39;t getting detected because the previous checksum only recorded when an event occurred (#697)<br>\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured<br>\n - Notifications regression bug in 0.39.15 - only sent the first notification URL<br>\n - Playwright screenshots - no need for high-res &#34;bug workaround&#34; screenshot, use lower quality/faster configurable image quality env var<br>\n - Adding extra check when updating DB on ReplyWithContentButNoText<br>\n - Notifications log - log what was sent after applying all cleanups<br>\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram<br>\n - Give more helpful error message when a page doesnt load<br>\n - Tweaks to playwright fetch code - better timeout handling<br>\n - Re #580 - New functionality - Random &#34;jitter&#34; delay to requests (#681)<br>\n<br>\n - 0.39.15<br>\n - Watch overview list - adding spinner to make it easier to see whats currently being &#39;Checked&#39;<br>\n - Preview section - add helpful check<br>\n - Send test notification - improved handling of errors<br>\n - Notification log - also log normal requests and make the log easier to find<br>\n - Update bug_report.md<br>\n - Use correct RSS CDATA handling (#662)<br>\n - Improve logging (#671)<br>\n - New [scrub] button when editing a watch - scrub single watch history (#672)<br>\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)<br>\n - Diff + Preview - Fixing screenshot behaviour after preference change<br>\n - Screenshot handling on the diff/preview section refactor (#630)<br>\n - Shared watches - include &#34;Extract text&#34; filter<br>\n - Improve error message when filter not found in page result (#666)<br>\n - &#34;Extract text&#34; filter - improve placeholder example<br>\n - Visual selector - &#39;clear selection&#39; button should clear the filter also<br>\n - New feature - &#34;Extract text&#34; filter ability (#624)<br>\n - Fixing RSS feed HTML content formatting (#662)<br>\n - Update notification library - Improving telegram support<br>\n - &#39;Mark all viewed&#39; button was missing in this version, added test also. (#652)<br>\n - Content fetcher - Handle when a page doesnt load properly<br>\n - Playwright - Correctly close browser context/sessions on exceptions<br>\n - Move history data to a textfile, improves memory handling (#638)<br>\n - Update feature_request.md<br>\n - Remove UK Covid news<br>\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)<br>\n - Remove group tag arbitrary length limit (#645)<br>\n - Distill.io import bug fix when no tags assigned to a watch (#557)<br>\n - Ignore whitespace on by default<br>\n - Visual Selector - clear events when changing tabs<br>\n - Minor code cleanup<br>\n - Re #616 - content trigger - adding extra test (#620)<br>\n - README.md update Visual Selector tool - tidy up screenshots, improve text<br>\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads<br>\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML<br>\n - Update bug_report.md<br>\n - 0.39.14.1<br>\n<br>\n - 0.39.14.1<br>\n - pip build fix - include API module<br>\n - Visual Selector - be more resilient when sites interfere with the xPath scraping<br>\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)<br>\n<br>\n - 0.39.14<br>\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)<br>\n - API Interface (#617)<br>\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )<br>\n - Fixing edit template HTML<br>\n - Proxy settings on watch should have a &#34;[ ] default&#34; option (#610)<br>\n - Input field tidyup (#611)<br>\n - Update wiki link for &#39;More info&#39; about sharing a watch and its configuration<br>\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)<br>\n - Playwright - raise EmptyReply on empty reply, no need to process further<br>\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)<br>\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)<br>\n - Update PIP readme.md<br>\n<br>\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)<br>\n<br>\n - 0.39.13<br>\n - Distill.io JSON export file importer (#592)<br>\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)<br>\n - Improving Playwright docs (#588)<br>\n - Playwright - code fix<br>\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO<br>\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)<br>\n - Playwright fetcher - use the correct default User-Agent<br>\n - Toggle visibility of extra requests options/settings when not in use (#584)<br>\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative)&nbsp;&nbsp;(#489)<br>\n - Simplify scrub operation (simply cleans all) (#575)<br>\n - Bugfix - dont update record when deleted during check<br>\n - Improving support info in README.md<br>\n - Handle deletions better (#570)<br>\n - Data storage bug fix #569<br>\n - Upgrade notifications library - fixing marketup in email subject<br>\n - Ability to &#39;Share&#39; a watch by a generated link, this will include all filters and triggers - see Wiki (#563)<br>\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title<br>\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds<br>\n - Seconds/minutes/hours/days between checks form field upgrade from &#39;minutes&#39; only (#512)<br>\n - Form styling improvements<br>\n - Form field handling improvements - fixing field list handler for empty lines<br>\n - Fix &#34;Add email&#34; button in main global notification settings<br>\n - Test notification button fixed in main settings (#556)<br>\n - tgram:// be sure total notification size is always under their 4096 size limit<br>\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)<br>\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes<br>\n - Discord:// notification size limit - also includes the notification title<br>\n - Fix spelling errors<br>\n - Update README.md<br>\n - Update README.md<br>\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)<br>\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable<br>\n - Refactor form handling (#548)<br>\n - Adding support for change detection of HTML source-code via &#34;source:https://website.com&#34; prefix (#540)<br>\n - Re-label the quick-add widget placeholder &#39;tag&#39; to &#39;watch group&#39;<br>\n - HTTP Fetcher code improvements<br>\n - Adding RSS metadata auto-discovery<br>\n - Upgrade WTforms form handler to v3 (#523)<br>\n<br>\n - 0.39.12<br>\n - Miscellaneous settings form visual improvements (#535)<br>\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes<br>\n - Specify our Discord avatar_url as default avatar_url<br>\n - Minor git updates<br>\n - Fix screenshot tab name<br>\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)<br>\n - Make long reports in the notification error log easier to read<br>\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)<br>\n - Update README.md<br>\n - Skip processing a watch into the RSS feed if there&#39;s not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)<br>\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)<br>\n - Make text tab always available at default<br>\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)<br>\n - Remove &#39;unviewed&#39; status in watch table when Diff link clicked (#514)<br>\n - RSS feed CDATA should contain difference output<br>\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output<br>\n - Update README.md<br>\n - Update README.md<br>\n - Minor UI cleanups (mobile tabs, font sizing) (#503)<br>\n - Fix typo in Filters &amp;amp; Triggers settings. (#495)<br>\n - Add autofocus attribute to password login field (#496)<br>\n<br>\n - 0.39.11<br>\n - Microsoft Windows installation fixes (#492)<br>\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)<br>\n - GitHub tweak - build containers also on push to master<br>\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)<br>\n - Security update - Use CSRF token protection for forms, make &#34;remove password&#34; use HTTP Post (#484)<br>\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)<br>\n - Only build container on GitHub releases, not tests<br>\n - Also change container names to help stop some DNS issues<br>\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)<br>\n - Improving form/edit example markup<br>\n - JSON diff/preview should use utf-8 encoding where possible (#465)<br>\n - Fix typo in settings form<br>\n - Add python venv to .gitignore<br>\n<br>\n - 0.39.10<br>\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)<br>\n - Minor updates to filters form text<br>\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)<br>\n - Testing - Refactor HTTP Request Type test (#453)<br>\n - Make table header font size the same as content<br>\n - Adjust background colours<br>\n - Handle the case where the visitor is already logged-in and tries to login again (#447)<br>\n - Make the Request Override settings easier to understand<br>\n - Minor tweak to notification token table<br>\n - Style tweak to watch form<br>\n - Login form style fixes<br>\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)<br>\n - Remove pytest from production release pip requirements<br>\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory<br>\n - Re-arranging primary links so the important ones are easier to find on mobile<br>\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)<br>\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)<br>\n - Better text/plain detection and refactor tests (#443)<br>\n - Tweak support tabs and text (#440)<br>\n - Include link to changedetection.io hosted option (#439)<br>\n -&nbsp;&nbsp;Improved CPU usage around the loop responsible for what sites needs to be checked<br>\n - Update README.md with hosting options<br>\n<br>\n - 0.39.9<br>\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)<br>\n - &#34;Recheck&#34; button should work when entry is in paused state<br>\n - Better file exception handling on saving index JSON<br>\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test<br>\n - Ensure string matching on the ignore filter is always case-INsensitive<br>\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page<br>\n - Update README.md<br>\n - XPath RegularExpression support<br>\n - better checking of JSON type<br>\n - Make system level errors from the HTTP fetchers easier to find (#421)<br>\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)<br>\n - Dont allow redirect on login, it&#39;s safer and more reliable this way (#414)<br>\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int<br>\n<br>\n - 0.39.8<br>\n - Number of fetching workers can be overriden by Env &#34;FETCH_WORKERS&#34; (#413)<br>\n - Adding Env var &#34;WEBDRIVER_DELAY_BEFORE_CONTENT_READY&#34; to wait n seconds before extracting the text from the browser<br>\n - Language fix &#34;watches are rechecking.&#34; it actually puts them into an internal queue &#34;watches are QUEUED for rechecking&#34;<br>\n - Use flask url_for() for webdriver chrome icon instead of relative path<br>\n - Fix typo in the startup create-directory command suggestion (#405)<br>\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)<br>\n - Refactor tests for notification error log handler (#404)<br>\n - Notification error log handler (#403)<br>\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.<br>\n - fixed the reference to wiki for rpi section (#402)<br>\n - /preview format doesnt need &amp;lt;pre&amp;gt; - fixing too many returnlines in content on diff/preview page<br>\n - Update README.md<br>\n - Update README - Fix docker section<br>\n - Update README - Tidy up sections<br>\n - Offer instance on Lemonade Tidy README<br>\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)<br>\n - #323 Adding note about discord:// 2000 char limit (#392)<br>\n - plaintext mime type fix - Don&#39;t attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)<br>\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch<br>\n - Add option for tags on import (#377)<br>\n - Update CONTRIBUTING.md<br>\n - Update README.md<br>\n - Fix bug where diff and diff_full were switched in notification templates. (#380)<br>\n - Closes #378<br>\n<br>\n - 0.39.7<br>\n - Scrub watch snapshot fixes<br>\n - Simple HTTP auth (#372)<br>\n - Adding note about JS pages<br>\n - Notification settings defaults and validation (#361)<br>\n - Filters settings helper text tidy-up<br>\n - Add test for low-level network error text handling<br>\n - Add API endpoint for current snapshot (#359)<br>\n - Clarify notice/messages around changing ignore text<br>\n<br>\n - 0.39.6<br>\n - Heroku tweaks (backup download) (#356)<br>\n - XPath support (#355)<br>\n - Better handling of EmptyReply exception, always bump &#39;last_checked&#39; in the case of an error (#354)<br>\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)<br>\n - fix typo in README.md (#350)<br>\n - Re #348 - Add test for backup, use proper datastore path<br>\n - Update README.md<br>\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)<br>\n - Re #340 - snapshot should not be modified by ignore text (#344)<br>\n - Re #133 Option for ignoring whitespacing (#345)<br>\n - Re #342 notification encoding (#343)<br>\n - Update README.md<br>\n - Adding global ignore text (#339)<br>\n - Adding new proxyType to selenium mappings<br>\n - Use selenium 4.1.0<br>\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594<br>\n - Add socksVersion mapping (#331)<br>\n - Fix broken RSS link fields<br>\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you&#39;re watching, and RSS Title is the page you&#39;re watching<br>\n - Unify Filters and Triggers tabs into a single tab<br>\n - Move &#39;request type&#39; field to the new &#39;Requests&#39; tab<br>\n - Aligning call signatures #325<br>\n - Extend Request Parameters to add Body &amp;amp; Method (#325)<br>\n - Update README.md<br>\n - Create CONTRIBUTING.md<br>\n - Update README.md<br>\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)<br>\n - Update README.md<br>\n - Update README.md<br>\n - Update README.md<br>\n<br>\n - 0.39.5<br>\n - Update feature_request.md<br>\n - Update issue templates<br>\n - Update bug_report.md<br>\n - Update issue templates<br>\n - W3C HTML validation issue around RSS icon<br>\n - Closes #323 adds link to wiki<br>\n - Update README.md<br>\n - Update README.md<br>\n - improve theming docs<br>\n - Update README.md<br>\n - Update README.md<br>\n - Closes #315 - Include library apprise Notify_mqtt<br>\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)<br>\n - Go back to docker hub<br>\n - RSS allow access via token (#310)<br>\n - Adding deploy to Heroku button<br>\n - Adding heroku app.json app<br>\n - Tweak runtime Heroku version<br>\n - Tweaking heroku Procfile<br>\n - Adjust buildpacks on Heroku<br>\n - Adding heroku python3 runtime config<br>\n - Try simpler heroku recipe<br>\n - -C option to create a datadir if it doesnt exist<br>\n - Re #308 - Adding test and including settings in clone operation (#309)<br>\n - fixing too small font in diff UI (#260)<br>\n - Update README.md<br>\n - Send diff in notifications (#296)<br>\n - Fix scrub form theme<br>\n - Scrub dates: Fix date regex limit handler parsing<br>\n - Wait 60 seconds or until stop_thread is set<br>\n - Check that a notification URL is set when sending the test notification (#300)<br>\n - Flask 2 (#299)<br>\n - Re #269 - Show current/correct BASE_URL information (#271)<br>\n - Re #269 - Fix env var comment name<br>\n - Enable Markdown and HTML notifications. (#288)<br>\n<br>\n - 0.39.4 release<br>\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)<br>\n - Fix element paths when using reverse proxy subfolder (#272)<br>\n<br>\n - 0.39.3 release<br>\n - Re #264 - fixing clone watch operation<br>\n - Re #265 - extended jsonpath support (#266)<br>\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly<br>\n - Re #257 - Handle bool val of json path better (#263)<br>\n - Re #249 - Add EXPOSE 5000 to Dockerfile<br>\n - Provide better combination of chardet and urllib3<br>\n - Prefer GHCR.io over DockerHub (#245)<br>\n - Limit branches/tags of container build<br>\n - Re #213 - Adding screensize examples to selenium container<br>\n - Be more specific about tagged release builds<br>\n - Fix :latest release worflow syntax check<br>\n - Form helper - explain where the webdriver setting comes from<br>\n - Rename workflow name<br>\n - Just &#39;published&#39; and &#39;edited&#39; package release is enough (remove &#39;created&#39;)<br>\n<br>\n - Fixing workflow tag syntax issues<br>\n - fix broken workflow syntax<br>\n - add step for metadata debug, see if it runs by checking workflow tag name<br>\n - Container build/push doesnt need to be so specific<br>\n - Oops on/release was in the wrong block<br>\n - release also on edited, published<br>\n - Run workflow on release<br>\n - Use a better switch mechanism for build type<br>\n - version 0.39.2<br>\n - Configurable BASE_URL (#228)<br>\n - Split python pip builder to its own release based workflow<br>\n - remove accidental syntax add<br>\n - Re #242 - app was treating notification field defaults as the field value (#244)<br>\n - attempt to re-enable docker layer cache<br>\n - Forgot GHCR tag with version<br>\n - Limit container build to releases and master<br>\n - Fix GHCR login<br>\n - Use the same workflow for tag and release<br>\n - Drop redundant build workflow<br>\n - try :latest and :tag in same workflow run<br>\n - Separate workflows<br>\n - Docker image build issues (#243)<br>\n - Re #239 - Individual GUID for watch+changeevent (#241)<br>\n - Update README.md<br>\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)<br>\n - Setting for Extract &amp;lt;title&amp;gt; as title option on individual watches (#229)<br>\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7<br>\n - GitHub container repo (#227)<br>\n - Remove extra build step<br>\n - push github container master also<br>\n - Tidy up workflow names<br>\n - Attempt to setup GitHub Container Registry<br>\n<br>\n - v0.39.1<br>\n - Re #185 - [feature] Custom notifications templates per watch (#226)<br>\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)<br>\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title<br>\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title<br>\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)<br>\n - Adds &#39;Create Copy&#39; feature to clone a watch (#184)<br>\n - adding specific test (#205)<br>\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)<br>\n - Re #203 - validate tokens (#204)<br>\n - No point hiding the notifications customisation area because it&#39;s now in its own tab<br>\n - Update README.md<br>\n - Test - prove that notifications are not being sent when content does not change<br>\n - remove quotes from env vars<br>\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts<br>\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label<br>\n - Update README.md<br>\n<br>\n - Installation via pip (#186)<br>\n - Update README.md<br>\n - Trigger text/wait (#187)<br>\n - Reword group tag - more obvious name<br>\n - Fix img alt/title accesibility for pause icon<br>\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway<br>\n - Example placeholder was pushed out<br>\n - Move fetcher tab back to general - save space on mobile<br>\n - WebDriver test fetch should use environment var too<br>\n - Add fetch option to each watch<br>\n - Chrome/Webdriver support for Javascript websites (#114)<br>\n - Fixing tar npm security issue npm install&nbsp;&nbsp;&#34;tar@&amp;gt;=6.1.2&#34;<br>\n<br>\n - tag 0.38.2<br>\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break &#34;Cookie&#34; header (#175)<br>\n - Update heroku.yml<br>\n - Re #156 - PORT should always be an Integer<br>\n - Re #159 - Adding env var example to docker-config.yml<br>\n - Add Heroku Deployment Support (#159)<br>\n - Re #154 - Handle missing JSON better<br>\n - high res<br>\n - higher res screenshot<br>\n - Update screenshot<br>\n - Assert that html_tools.JSONNotFound is correctly raised<br>\n - Re #154 Ldjson extract parse (#158)<br>\n - Responsive fix for input field on mobile<br>\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.<br>\n - Add medium-size-desktop class to notification custom title<br>\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services<br>\n - Re #150 - stop using &#39;size&#39; across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)<br>\n - fix: setting overflow in mobile view (#150)<br>\n - Re #121, #123 - Show the current base_url value<br>\n - Re #149 - allow empty timestamp limit for scrub operation<br>\n - Dont show &#34;new version available&#34; message when password is enabled and user is logged out<br>\n - test fix - dont trigger notifications in header test<br>\n - Strengthen the notification tests<br>\n - Re #137 - Adding test to confirm that headers are not repeated<br>\n - Add debug output to notify loop<br>\n - Add note to field<br>\n - Cleanup test helper data before and after running<br>\n - Improve debug info<br>\n<br>\n - 0.38.1 tag<br>\n - Re #143 - Remove old notification test code, fix form handler (#145)<br>\n - Update README.md<br>\n - Re #135 - refactor the quick add widget (#136)<br>\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)<br>\n<br>\n - use a github action for getting the tag<br>\n - rename tag build runner<br>\n - fix tag<br>\n - build and push tag<br>\n - Re #76 - Fixing links<br>\n - Cleaner is to let flexbox overflow and scroll on the X where needed<br>\n - #76 app path prefix when behind proxy_pass (#91)<br>\n - Settings: Remove password link fix<br>\n - Make sure right menu is still visible when URL is long<br>\n - 0.38 release<br>\n - Re #132 - Make a list of the JSONpath results instead of using only the first value<br>\n - Customisable notifications (#123)<br>\n - Re #117 - dont re-encode single value types, looks better in the diff<br>\n - Usability tweak - [edit] on diff page should go back to diff page<br>\n - Update README.md<br>\n - Adding text about JSON API Monitoring<br>\n - Re #117 Jsonpath based JSON change detection filter (#125)<br>\n - Update README.md<br>\n - Update README.md<br>\n - Use right sticky for version<br>\n - Re #118 - Make &#39;show current version&#39; more obvious<br>\n - Diff page - use the document title in &amp;lt;title&amp;gt; for better bookmarking<br>\n - node-sass 6.0.1 works with node-sass watch way better<br>\n - Updating inscriptis/text/html library to 1.2<br>\n - Update readme with the branch link for javascript support<br>\n - Updating trim-newlines packages<br>\n<br>\n - 0.37 release<br>\n - #110 global recheck time (#113)<br>\n - Re #106 - handling empty title with gettr cleanup (#107)<br>\n - Update README.md<br>\n - Auto extract html title as title (#102)<br>\n - Bug fix - Check &#39;minutes_between_check&#39; is set<br>\n - tweak &amp;lt;pre&amp;gt; text wrapping when displaying diff<br>\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<br>\n - CSS Filter - restore nicer linefeeds<br>\n - @todo Comment - BS4&#39;s element.get_text() seems to lose the indentation format no-matter what<br>\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines<br>\n - Include statistics for number of watches<br>\n - Set edit-form for settings+watch to always be wide<br>\n<br>\n - Update README.md<br>\n - 0.36<br>\n - Re #42 - dont use blank titles<br>\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage<br>\n<br>\n - 0.35<br>\n - Time between rechecks is always stored as minutes<br>\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance<br>\n - Adding tests for password control handling<br>\n - Remove unused field (removepassword is actually a link)<br>\n<br>\n - 0.34<br>\n - Be sure not to use blank passwords as the password<br>\n - Re #42 - custom title (#98)<br>\n - Re #92 - Re-use existing [preview] function for viewing current (#97)<br>\n<br>\n - 0.33<br>\n - #81 - Regex support (#90)<br>\n - Use wtforms handler (#96)<br>\n - Re #95 - Include PUID/PGID example<br>\n - re-enable tests<br>\n - On settings submit, display saved message<br>\n - Use flasks&#39; built in &#39;flash&#39; method instead of a custom message/notices (#94)<br>\n - Adding rPi support info<br>\n - Re #92 Adding link to CSS selector help in wiki<br>\n - Re #93 - tweak build packages<br>\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc<br>\n - Strip surrounding whitespace from elements (#89)<br>\n - Queue an entry for immediate recheck after [edit]<br>\n - Adding helper method to remove text files that are not in the index<br>\n - Fix typo<br>\n - Re #88 - placeholder text on CSS rule<br>\n - Re #86 - fix typo<br>\n<br>\n - 0.32 release<br>\n - Sassify the diff page<br>\n - &#34;Sassify&#34; the theme, easier to manage<br>\n - Mobile fixes (#87)<br>\n - Re #86 - Refactor scrub date limit code<br>\n - Tweak comments<br>\n - Re #77 - Repair and refactor time threshold check code<br>\n - Modifies Dockerfile to use multistage builds (#79)<br>\n - Bumping to 0.31<br>\n<br>\n - Re #75 - Adding test to confirm watched URL appears in RSS feed<br>\n - CSS selector filter (#73)<br>\n - Fixing var name<br>\n - Include release metadata during github build<br>\n - Update README.md<br>\n - Re #40 Ability to set individual timers (#72)<br>\n - Update README.md<br>\n - Improvements for backup (#70)<br>\n - Update README.md<br>\n - Disable image layer cache service<br>\n - Re-enable ARM v6/v7 builds<br>\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size<br>\n - Remove rust build comments<br>\n - Arm build fixes (#68)<br>\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)<br>\n - Update README.md<br>\n - Adding BTC support instructions<br>\n - Switch to just amd64 for now due to apprise not building on ARM<br>\n - Fixing syntax<br>\n - Re #49 Re #60 - Adding more information about proxy setup to README.md<br>\n - Add socks proxy support (#60)<br>\n - Created docker-compose file (#55)<br>\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in &#39;seconds&#39; instead of minutes)<br>\n - 56 - Fix notification test<br>\n - Update README.md<br>\n - Update README.md<br>\n - Adding rust compiler :(<br>\n - trying without libssl and only libffi<br>\n - Adding extra libs required for build<br>\n - Cleanup docs<br>\n - Tweak workflow (tests)<br>\n<br>\n - Security update<br>\n - Apprise notifications (#43)<br>\n - Fixing security update<br>\n - Also detect pytest in the environ (for local debug)<br>\n - Prepend &#39;test-&#39; when runnning under pytest to guid<br>\n - - Relabel login button - misc test cleanup<br>\n - Re #46 - Add note to README.md about Javascript support<br>\n - Bumping version<br>\n - Re #45 - Set datastore path in app.config<br>\n - Re #44 - Broke the menu by accident, adding tests and fixing.<br>\n - bump to 0.29<br>\n<br>\n - docker-compose for dev not needed (use venv etc)<br>\n - Password protection / login support (#34)<br>\n - Update FUNDING.yml<br>\n - Skip using tag limit on pause when no tag is being viewed<br>\n - Pause/Unpause should respect limit tag on redirect<br>\n - Validate duplicate URLs<br>\n - Chdir is not needed because we add the file from the full path, but make it &#39;relative&#39; in the Zip<br>\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)<br>\n - Adding noopener per CodeQL, stop pages from knowing the referer etc<br>\n - Create codeql-analysis.yml<br>\n - yarl not needed, lock requests version<br>\n - dev packages needed, drop apt cache<br>\n - See if we get a clean buildx without dev packages<br>\n - Tweaking build size thanks to https://github.com/hadolint/hadolint<br>\n - Adding dockerignore<br>\n - Re #18 - Show &#34;preview&#34; of the page when only one revision exists (#33)<br>\n - Update README.md<br>\n - Update README.md<br>\n - Also check that the watch is not paused before putting it into the checking queuex<br>\n - revert c60be562718d23972d7d43821bb6b87f2add3256<br>\n - remove extra packages (#32)<br>\n<br>\n - Bumping version to 0.28<br>\n - Docker push amd64 rpi etc (#28)<br>\n - Open [diff] links into their own window<br>\n - Fix auto jump on viewing the diff<br>\n - Re #30 - Delete history watch snapshots (#31)<br>\n - Slow down the DB write interval and catch the case that it changed during write<br>\n - Immediately &#39;jump&#39; to the change<br>\n - Tweak to hover pause icon<br>\n - Stop runtime error on dict changing during write/init at start (#27)<br>\n - Re #22 - ability to pause<br>\n - Re #23 - always check value of interval time, not just on start<br>\n - Update README.md<br>\n - Use absolute image links so the screenshots work from docker hub<br>\n - Update README.md<br>\n - Updating screenshot<br>\n - Reuse the GUID if we have one<br>\n<br>\n - Dont show &#39;empty&#39; tag, it will be in the [ALL] list<br>\n - Adding RSS feed icon<br>\n - Generic object sync should use private method<br>\n - Add missing urllib3<br>\n - Add missing pytz<br>\n - Check for new version<br>\n - Fix import form flow logic<br>\n - Code tidy/lint<br>\n - Tidy up thread logic and version check<br>\n - Add missing dep<br>\n - Remove todos<br>\n - Add icon for RSS, RSS should show only unviewed entries<br>\n - Issue #7 - RSS feeds<br>\n - Always override tag version (load from disk in future, so we can add it at build time)<br>\n - next dev is 0.27<br>\n - Tweak to tests<br>\n - Move logic<br>\n - Remove erroneous extra liveserver setup<br>\n - When new ignore text is specified, reprocess the checksum<br>\n - Adding filter and log output to pytest<br>\n - Fix edit action link<br>\n - Minor lint cleanup<br>\n - Clean up after test case<br>\n - Remove liveserver, doesnt belong here<br>\n - Fix syntax, Triggers the workflow on push or pull request events<br>\n - Activate workflow on all branches<br>\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text<br>\n - Validation of added headers, should contain key/val (2 parts)<br>\n - Issue #12 include version for easy reference.<br>\n - Bring dev environment inline<br>\n - Tidying up requirements.txt<br>\n<br>\n - Handle the case of someone supplying a bad link<br>\n - Adding jump to next change diff widget<br>\n - Moving nice screenshot to above the fold :)<br>\n - Adding docker hub badge for tag information<br>\n<br>\n - Bumping schema tag to 0.25<br>\n - Issue #5 - Remove arbitrary &#39;600&#39; minutes limit<br>\n - Add test delay for github action test<br>\n - Add wait for threads in test<br>\n - Extending tests to cover resetting the diff/unviewed status correctly<br>\n - Tidy up return logic<br>\n - Code tidy<br>\n - Fix docker app files paths<br>\n - Tweaking Dockerfile for new eventlet wrapper<br>\n - Create LICENSE<br>\n - Adding docker pulls counter badge<br>\n - Use master branch for badge<br>\n - Removing unused import<br>\n - Fixing a few more easy lint wins<br>\n - Linting fixups<br>\n - Update README.md<br>\n - Add badge under pytest branch<br>\n - Create python-app.yml<br>\n - Create the test datastore<br>\n - Minor cleanup<br>\n - Just use the current/previous md5<br>\n - Finalse pytest methods<br>\n - Port should be an integer<br>\n - Tweaking client<br>\n - remove unused imports<br>\n - Use session/client fixture<br>\n - Addingmissing files<br>\n - hack of pytest implementation - doesnt work yet<br>\n - Tidy up a few broken datastore paths<br>\n - WIP, separate out the Flask from everything else, get pytest working<br>\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold<br>\n<br>\n - Adding 0.24 tag<br>\n - Avoid accidently using Python&#39;s objects that are copied - but land as a &#39;soft reference&#39;, need to use a better dict struct in the future #6<br>\n - Minor fix to &#39;last changed&#39; field, simplify template and logic<br>\n - Remove debug print<br>\n<br>\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch<br>\n<br>\n - Adding tag to json<br>\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old<br>\n - Minor fix - load extra stylesheet only once<br>\n - Minor tweaks for development setup<br>\n - Provide named containers and remove all existing<br>\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)<br>\n - Flag for immediate sync of index after adding new watch<br>\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member<br>\n - Adding ARG to Dockerfile<br>\n - Include the triggered build SHA as part of the backup info, when built in docker hub.<br>\n - Add cache busting var to style sheets<br>\n - Slightly more bulletproof instructions<br>\n - Updating screenshot<br>\n - Push newly created watches directly into the update check Queue.<br>\n - Adding checkall<br>\n - Easily download a full backup<br>\n - Show the date/time of the current/most up to date version<br>\n - Use a pool of thread workers, better for huge lists of watchers<br>\n - Code cleanup edit submit handler can be the same function<br>\n - Add update howto<br>\n - Refactor slightly confusing difference build function<br>\n - Version comparison had the wrong order<br>\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<br>\n<br>\n - Include the current URL in the page when viewing the version diff<br>\n - Include a selfcheck/diagnosis routine<br>\n - On manual recheck request, redirect to same tag listing<br>\n - Set default diff type to &#39;lines&#39;, faster for starters.<br>\n - Supply different versions to browse<br>\n - Fix heading<br>\n - Update README.md<br>\n - Adding diff screenshot<br>\n - Add more start-up examples<br>\n - Tweak theming<br>\n - Use a even simpler run command<br>\n - improve the wording<br>\n - Add basic settings page (so far just recheck time in minutes)<br>\n - Updating README<br>\n - Updating screenshot (new diff button)<br>\n - Trigger write index after edit of a watch<br>\n - Add [diff] mechanism<br>\n - Use a single thread for writing the sync json<br>\n - Use existing tag<br>\n - When all items showed, show which tag it belongs to<br>\n - Sort tag list<br>\n - Set active tag selection<br>\n - Support for comma separated tags<br>\n - Tweak styling for &#39;new watch&#39; form<br>\n - Remove import for old lib<br>\n - Switch to inscriptis prepare config backend struct<br>\n - Support for custom headers per watch<br>\n - Going back to larger PNG screenshot, looks better in Github :)<br>\n - Fix alt text in markup<br>\n - Adding new screenshot binary<br>\n - Updating screenshot<br>\n - Moving start text to a more visible part<br>\n - Tweak messages<br>\n - Change message text<br>\n - Fixing messages styling<br>\n - Basic tag browse buttons<br>\n - Bulk import<br>\n - Tidy up &#39;last_checked&#39; date handling<br>\n - Dev environment setup<br>\n - Dev docker tweaks<br>\n - Remove messy text<br>\n - Tweaking text<br>\n - Fixing checkall hook<br>\n - Use requests&#39;s r.text so we dont have to deal with charsets<br>\n - Add note<br>\n - Fix bad copy command<br>\n - Oops left out the image name<br>\n<br>\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io<br>\n - Update screenshot<br>\n<br>\n - Add more start-up examples<br>\n - Tweak theming<br>\n - Use a even simpler run command<br>\n - improve the wording<br>\n - Add basic settings page (so far just recheck time in minutes)<br>\n - Updating README<br>\n - Updating screenshot (new diff button)<br>\n - Trigger write index after edit of a watch<br>\n - Add [diff] mechanism<br>\n - Use a single thread for writing the sync json<br>\n - Use existing tag<br>\n - When all items showed, show which tag it belongs to<br>\n - Sort tag list<br>\n - Set active tag selection<br>\n - Support for comma separated tags<br>\n - Tweak styling for &#39;new watch&#39; form<br>\n - Remove import for old lib<br>\n - Switch to inscriptis prepare config backend struct<br>\n - Support for custom headers per watch<br>\n - Going back to larger PNG screenshot, looks better in Github :)<br>\n - Fix alt text in markup<br>\n - Adding new screenshot binary<br>\n - Updating screenshot<br>\n - Moving start text to a more visible part<br>\n - Tweak messages<br>\n - Change message text<br>\n - Fixing messages styling<br>\n - Basic tag browse buttons<br>\n - Bulk import<br>\n - Tidy up &#39;last_checked&#39; date handling<br>\n - Dev environment setup<br>\n - Dev docker tweaks<br>\n - Remove messy text<br>\n - Tweaking text<br>\n - Fixing checkall hook<br>\n - Use requests&#39;s r.text so we dont have to deal with charsets<br>\n - Add note<br>\n - Fix bad copy command<br>\n - Oops left out the image name<br>\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io<br>\n - Update screenshot<br>\n<br>\n - Add more start-up examples<br>\n - Tweak theming<br>\n - Use a even simpler run command<br>\n - improve the wording<br>\n - Add basic settings page (so far just recheck time in minutes)<br>\n - Updating README<br>\n - Updating screenshot (new diff button)<br>\n - Trigger write index after edit of a watch<br>\n - Add [diff] mechanism<br>\n - Use a single thread for writing the sync json<br>\n - Use existing tag<br>\n - When all items showed, show which tag it belongs to<br>\n - Sort tag list<br>\n - Set active tag selection<br>\n - Support for comma separated tags<br>\n - Tweak styling for &#39;new watch&#39; form<br>\n - Remove import for old lib<br>\n - Switch to inscriptis prepare config backend struct<br>\n - Support for custom headers per watch<br>\n - Going back to larger PNG screenshot, looks better in Github :)<br>\n - Fix alt text in markup<br>\n - Adding new screenshot binary<br>\n - Updating screenshot<br>\n - Moving start text to a more visible part<br>\n - Tweak messages<br>\n - Change message text<br>\n - Fixing messages styling<br>\n - Basic tag browse buttons<br>\n - Bulk import<br>\n - Tidy up &#39;last_checked&#39; date handling<br>\n - Dev environment setup<br>\n - Dev docker tweaks<br>\n - Remove messy text<br>\n - Tweaking text<br>\n - Fixing checkall hook<br>\n - Use requests&#39;s r.text so we dont have to deal with charsets<br>\n - Add note<br>\n - Fix bad copy command<br>\n - Oops left out the image name<br>\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io<br>\n - Update screenshot<br>\n - Add edit UI Move to keyed structure instead of list<br>\n - Fixes to CSS<br>\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads<br>\n - Tweaks to docker layout<br>\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc<br>\n - Create FUNDING.yml<br>\n<br>\n - Specify image name in docker files to avoid a confusing build/run<br>\n - Tidy up devel docker<br>\n - Tweak comments<br>\n - Avoid recasting the type<br>\n - Store a history of changes, used for future lookup/diff/explore changes UI<br>\n - Update README.md<br>\n - Show the backend error in the table if there is one<br>\n - Include screenshot<br>\n - Fix branch name<br>\n - Tweak todo<br>\n - Adding README amd docker info<br>\n - Add missing file<br>\n - Primitive support for extra headers<br>\n - remove debug<br>\n - Handle titles and links<br>\n - Fix base definition of the watcher<br>\n - sort by last changed<br>\n - fix button size<br>\n - Store the html2text version too<br>\n - fix favicon<br>\n - small fixes<br>\n - Handle errors better, use the plaintext output<br>\n - Workon threads<br>\n - WIP<br>\n - Remove nocache experimental<br>\n - Initial commit<br>\n<br>\n&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;", "url": "smtp2go://info@bvs-kassen.de/api-FD02EAF14E8B46C9993479DCBA517C79/info@bvs-kassen.de/?from=\"Changedetection%20Dashboard\"&avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=html", "original_context": {"base_url": "https://change.bvs-kassen.de/", "change_datetime": "2026-04-28 08:46:22 CEST", "current_snapshot": "<html><head><meta name=\"color-scheme\" content=\"light dark\"></head><body><pre style=\"word-wrap: break-word; white-space: pre-wrap;\"> _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \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 &lt;5,&gt;=4.9.0 to &gt;=4.13.1,&lt;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 &amp;nbsp; 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 `&lt;head&gt;` 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 &amp; 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 &amp; 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&amp;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 &amp; 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 &lt;title&gt; 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 &lt;-&gt;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` -&gt; `&lt;br&gt;` 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 &lt;select&gt; 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 &lt;title&gt; 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 &lt;title&gt;, `{{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 &amp; 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 - &lt;Select&gt; by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &lt;button&gt; (#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 &amp; 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\u00c3\u00a9t\u00c3\u00a9 Fran\u00c3\u00a7aise du Radiot\u00c3\u00a9l\u00c3\u00a9phone (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 &gt; 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 &amp; 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 &lt;title&gt; as title should work on all processors (#2490)\n - Restock &amp; 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 -&gt; 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 &amp; 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/&lt;uuid&gt;/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 &lt;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 &lt;title&gt; 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 - &lt;input&gt; 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 -&gt; tags -&gt; 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 &lt;div&gt; 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 &lt;/span&gt; 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 `&lt;/br&gt;` 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 &gt;=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 &amp; 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 &amp; 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 &amp; python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker &amp; 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 &amp; 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 &amp; 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 &amp; 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 &lt;pre&gt; - 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 &amp; 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 &lt;title&gt; 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@&gt;=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 &lt;title&gt; 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 &lt;pre&gt; 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</pre></body></html>", "diff": "", "diff_clean": "", "diff_added": "@changed_PLACEMARKER_OPENHEAD / 2026-04-28 02:46:40 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - 0.55.3@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - Recompile languages@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - 0.55.2@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - typo: {{diff_url}} token mentioned twice (#4094)@changed_into_PLACEMARKER_CLOSED", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://change.bvs-kassen.de/diff/c47245b6-2403-41f5-8635-e3d47f5e2c80", "markup_text_links_to_html_links": false, "notification_timestamp": 1777358805.8080165, "prev_snapshot": "<html><head><meta name=\"color-scheme\" content=\"light dark\"></head><body><pre style=\"word-wrap: break-word; white-space: pre-wrap;\"> _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-04-28 02:46:40 +0200:\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 &lt;5,&gt;=4.9.0 to &gt;=4.13.1,&lt;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 &amp;nbsp; 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 `&lt;head&gt;` 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 &amp; 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 &amp; 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&amp;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 &amp; 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 &lt;title&gt; 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 &lt;-&gt;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` -&gt; `&lt;br&gt;` 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 &lt;select&gt; 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 &lt;title&gt; 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 &lt;title&gt;, `{{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 &amp; 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 - &lt;Select&gt; by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &lt;button&gt; (#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 &amp; 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\u00c3\u00a9t\u00c3\u00a9 Fran\u00c3\u00a7aise du Radiot\u00c3\u00a9l\u00c3\u00a9phone (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 &gt; 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 &amp; 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 &lt;title&gt; as title should work on all processors (#2490)\n - Restock &amp; 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 -&gt; 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 &amp; 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/&lt;uuid&gt;/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 &lt;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 &lt;title&gt; 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 - &lt;input&gt; 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 -&gt; tags -&gt; 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 &lt;div&gt; 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 &lt;/span&gt; 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 `&lt;/br&gt;` 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 &gt;=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 &amp; 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 &amp; 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 &amp; python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker &amp; 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 &amp; 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 &amp; 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 &amp; 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 &lt;pre&gt; - 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 &amp; 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 &lt;title&gt; 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@&gt;=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 &lt;title&gt; 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 &lt;pre&gt; 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</pre></body></html>", "preview_url": "https://change.bvs-kassen.de/preview/c47245b6-2403-41f5-8635-e3d47f5e2c80", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "c47245b6-2403-41f5-8635-e3d47f5e2c80", "watch_mime_type": "text/plain", "watch_tag": "Software", "watch_title": "Changedetection.io", "watch_url": "https://changedetection.io/CHANGELOG.txt", "watch_uuid": "c47245b6-2403-41f5-8635-e3d47f5e2c80", "notification_urls": ["smtp2go://info@bvs-kassen.de/api-FD02EAF14E8B46C9993479DCBA517C79/info@bvs-kassen.de/?from=\"Changedetection%20Dashboard\""], "notification_title": "{{watch_title}} \u00c4nderungsmitteilung", "notification_body": "Auf {{watch_url}} hat sich etwas ge\u00e4ndert:\r\n---\r\n{{diff_url}}\r\n---\r\n{{diff_added}}\r\n---\r\n{{current_snapshot}}", "notification_format": "htmlcolor", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://change.bvs-kassen.de/edit/c47245b6-2403-41f5-8635-e3d47f5e2c80", "raw_diff": ""}}]
  • Tue 28 Apr 2026 05:46:45 AM - SENDING - null
  • 2026-04-28 05:46:49,912 - DEBUG - Socket Exception: HTTPSConnectionPool(host='api.smtp2go.com', port=443): Read timed out. (read timeout=4.0)
  • 2026-04-28 05:46:49,912 - WARNING - A Connection error occurred sending SMTP2Go:info@bvs-kassen.de notification.
  • 2026-04-28 05:46:45,176 - DEBUG - SMTP2Go Payload: {'api_key': 'api-FD02EAF14E8B46C9993479DCBA517C79', 'sender': 'info@bvs-kassen.de', 'subject': 'Changedetection.io Änderungsmitteilung', 'to': ['info@bvs-kassen.de'], 'html_body': "<string len=157852 head='Auf https://changedetection.io/C' tail='re&gt;&lt;/body&gt;&lt;/html&gt;'>"}
  • 2026-04-28 05:46:45,175 - DEBUG - SMTP2Go POST URL: https://api.smtp2go.com/v3/email/send (cert_verify=True)
  • 2026-04-28 05:46:45,175 - DEBUG - Loaded SMTP2Go URL: smtp2go://info@bvs-kassen.de/a...9/?batch=no&format=html&overflow=upstream
  • Mon 27 Apr 2026 05:46:44 PM - SENDING - [{"title": "Changedetection.io \u00c4nderungsmitteilung", "body": "Auf https://changedetection.io/CHANGELOG.txt hat sich etwas ge\u00e4ndert:<br>\n---<br>\nhttps://change.bvs-kassen.de/diff/c47245b6-2403-41f5-8635-e3d47f5e2c80<br>\n---<br>\n<span style=\"background-color: #fadad7; color: #b30000;\" role=\"note\" aria-label=\"Changed text\" title=\"Changed text\">HEAD / 2026-04-27 17:11:06 +1000:</span><br>\n<span style=\"background-color: #eaf2c2; color: #406619;\" role=\"note\" aria-label=\"Changed into\" title=\"Changed into\">HEAD / 2026-04-28 00:37:14 +1000:</span><br>\n<span style=\"background-color: #eaf2c2; color: #406619;\" role=\"note\" aria-label=\"Changed into\" title=\"Changed into\"> - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)</span><br>\n---<br>\n&lt;html&gt;&lt;head&gt;&lt;meta name=&#34;color-scheme&#34; content=&#34;light dark&#34;&gt;&lt;/head&gt;&lt;body&gt;&lt;pre style=&#34;word-wrap: break-word; white-space: pre-wrap;&#34;&gt;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp; _&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp; _&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_&nbsp;&nbsp;&nbsp;&nbsp; <br>\n __| |_&nbsp;&nbsp;__ _ _ _&nbsp;&nbsp;__ _ ___ __| |___| |_ ___ __| |_(_)___ _ _&nbsp;&nbsp; (_)___ <br>\n/ _| &#39; \\/ _` | &#39; \\/ _` / -_) _` / -_)&nbsp;&nbsp;_/ -_) _|&nbsp;&nbsp;_| / _ \\ &#39; \\ _| / _ \\<br>\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/<br>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|___/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>\n<br>\nHEAD / 2026-04-28 00:37:14 +1000:<br>\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)<br>\n - i18n - Recompile languages<br>\n<br>\n - 0.55.1<br>\n - Security - Hardening XML parser against XXE<br>\n - Security - Stored XSS via Tag Name in Modal Dialog<br>\n - Security - Arbitrary Local File Read via crafted backup restore<br>\n - i18n - Update Korean language (#4084)<br>\n - [i18n] &#34;Usage&#34; tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)<br>\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)<br>\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)<br>\n - LLM / AI Change detection rules and Summaries<br>\n - Bumping README<br>\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)<br>\n - CI - Translation sync check (#4085)<br>\n - Update python-engineio requirement from &amp;lt;5,&amp;gt;=4.9.0 to &amp;gt;=4.13.1,&amp;lt;5 (#4079)<br>\n - CI - Re #4080 msgfmt linting (#4081)<br>\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)<br>\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)<br>\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)<br>\n<br>\n - 0.54.10<br>\n - UI - Fix unresponsive &#34;Show advanced help and tips&#34; button on tag edit screen (#4055)<br>\n - Fix untranslated labels on mobile watchlist view (#4064)<br>\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)<br>\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)<br>\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)<br>\n<br>\n - 0.54.9<br>\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)<br>\n - Translations - JA - Recompile<br>\n - Fix strings not rendered in user&#39;s locale despite having .po entries (#4051)<br>\n - Update Japanese translations for new strings and fix fragment handling (#4050)<br>\n - Notifications - Discord #3721 - Dont use &amp;amp;nbsp; for discord (Actually Discord:// notifications should always use plaintext format anyway)<br>\n - Test improvement - text extract tidyup (#4048)<br>\n - Text filters - New simpler filter &#34;Extract lines containing text&#34; (#4046)<br>\n - Handle inline favicons (#4047 #3891 )<br>\n - UI - URL field should be just a string field (Not type=url) because URLs with Jinja2 macros could cause false errors #3777<br>\n - Add complete Turkish translation (#4044)<br>\n - Czech l12n updates (#4043)<br>\n - fix: XLSX import error messages report wrong row number after failed rows + test (#4036)<br>\n - Test - word-level diff - Re #4037 - adding test (#4042)<br>\n - Fix/step failure notification crash (#4041)<br>\n - Groups - Set custom colour for tag/group/label background (#4040)<br>\n - fix: pass include_change_type_prefix to word-level diff (#4037)<br>\n - Add Portuguese (Brasil) translation (#4033)<br>\n - Feature - Groups/tag - Apply a group by specifying a wildcard, ie `*.mysite.com*` (#4032)<br>\n - diff_changed_from/diff_changed_from tokens - improve documentation<br>\n - Notification - Adding tokens `{{diff_changed_from}}` and `{{diff_changed_to}}` #3818 (#4031)<br>\n - Fix `SCREENSHOT_MAX_HEIGHT` not enforced: cap viewport step_size and clip stitched output to max capture height #3810 (#4030)<br>\n - UI - Minor text fix and add link to &#39;Restock Backup&#39; from Imports<br>\n - Update Selenium RemoteConnection to use ClientConfig for timeout (#4027)<br>\n - Add Japanese translation (ja) (#4019)<br>\n - UI - German translation: Visual Filter: &#34;Klare Auswahl&#34; is very misleading #4023<br>\n<br>\n - 0.54.8<br>\n - CVE-2026-35490 - Authentication Bypass via Decorator Ordering<br>\n - Update openapi-core requirement from ~=0.22 to ~=0.23 (#4009)<br>\n - Ensure all unit tests are run (#4022)<br>\n - Extendable theme pluggy implementation for main theme/template `&amp;lt;head&amp;gt;` section&nbsp;&nbsp;(#4011)<br>\n - Update docker-compose.yml<br>\n - Update docker-compose.yml<br>\n<br>\n - 0.54.7<br>\n - Translations - recompiling<br>\n - fix: Czech translation strings updated (#4008)<br>\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )<br>\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters<br>\n - UI - Settings - Dont let &#39;password&#39; field autocomplete (chrome)<br>\n - `last_error` should be cleared if page content was the same and there was no error (#3997)<br>\n - fix: correct critical errors in Spanish (es) translation (#3994)<br>\n - Restock - Add previous_price to restock values #3987 (#3993)<br>\n - UI - Scan/check all proxies - Regression fix from earlier refactor<br>\n - Realtime - Suppress socket.io errors in logs (#3991)<br>\n - UI - Text tidyup (#3989)<br>\n<br>\n - 0.54.6<br>\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)<br>\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)<br>\n - fix: add commit calls for pause and mute operations (#3978)<br>\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)<br>\n<br>\n - 0.54.5<br>\n - CI - YML tidyup<br>\n - Docker image - Improving org.opencontainers labels for dev containers<br>\n - Docker image - Improving org.opencontainers labels #3794<br>\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)<br>\n - UI - Fixing Preview &#34;GO&#34; version button (#3969)<br>\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)<br>\n - Add complete Spanish translation (es) (#3961)<br>\n - Various memory and CPU improvements (#3960)<br>\n - CI - Bump the all group with 5 updates (#3955)<br>\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)<br>\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)<br>\n - Restock - No need to extract the text because it&#39;s not used anyway (#3951)<br>\n<br>\n - 0.54.4<br>\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response<br>\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()<br>\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases<br>\n - Updating API docs with better processor plugin info (#3942)<br>\n - Python 3.14 CI test and support (#3941)<br>\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)<br>\n<br>\n - 0.54.3<br>\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)<br>\n - Adding Ukranian translations, rebuilding translations. (#3936)<br>\n - Update messages.po in French translation (#3926)<br>\n<br>\n - 0.54.2<br>\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)<br>\n - CI workflow - Bump the all group with 2 updates (#3931)<br>\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)<br>\n - API - Processors configuration is now part of the API&nbsp;&nbsp;(#3902)<br>\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)<br>\n - Fixing `change_datetime` notification token (and adding test) (#3922)<br>\n<br>\n - 0.54.1<br>\n - Tests - Tweaks to upgrade path tests<br>\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true<br>\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.<br>\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request<br>\n<br>\n - 0.53.7<br>\n - Libraries/Build - unpin referencing library (#3919)<br>\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)<br>\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)<br>\n<br>\n - 0.53.6<br>\n - Pip installs - remove flask patch and pin library versions<br>\n - Lazy load flask_compress<br>\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress &amp;amp; socket.io<br>\n<br>\n - 0.53.5<br>\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)<br>\n - UI - Backup restore (#3899)<br>\n<br>\n - 0.53.4<br>\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)<br>\n - UI - Search modal - fixes for running in sub path<br>\n - Puppeteer - Adding extra browser cleanup (#3897)<br>\n - Puppeteer - Use a modern scroll method for screenshot stitching<br>\n - UI - CSS - Ensure &#39;difference&#39; &#39;preview&#39; both wraps by word and by very long strings<br>\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)<br>\n - Fix: Some SPA&#39;s also set body content to display: none which breaks text output<br>\n - &#34;Error 200 no content&#34; - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)<br>\n - UI - Filters &amp;amp; Triggers - Adding reminder that you can also use &#39;Conditions&#39; for trigger rules<br>\n - Minor code tidy<br>\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)<br>\n - UI - More fixes for realtime updates<br>\n - UI - Fixing realtime updates for status updates when checking (#3889)<br>\n - Pluggy plugin hook for before and after a watch is processed (#3888)<br>\n<br>\n - 0.53.3<br>\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)<br>\n - UI - Use version from code in version tab<br>\n<br>\n - 0.53.2<br>\n - UI - Watch overview - Restock price, validate number before output (#3883)<br>\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)<br>\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories<br>\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources<br>\n - Browser Steps - Minor code cleanup<br>\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons<br>\n<br>\n - 0.53.1<br>\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)<br>\n - Test - Improve test for watch package download<br>\n - UI - Watch data download, fix test, update text.<br>\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)<br>\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.<br>\n - Avoid reprocessing if the page was the same (#3867)<br>\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)<br>\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)<br>\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)<br>\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)<br>\n - Refactoring upgrade path (#3861)<br>\n - API - Import use background task to import large lists (#3858)<br>\n - API - Bumping docs<br>\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&amp;amp;time_between_check={&#39;hours&#39;:24}&nbsp;&nbsp;Re #3845 (#3857)<br>\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)<br>\n - UI - Bulk checkbox operations modal confirmation fix Re #3853<br>\n - Tags update fix (#3849)<br>\n - Refactor for Tags storage (#3848)<br>\n - Including uptime in UI settings/info<br>\n - Refactor&nbsp;&nbsp;watch saving backend, closes #3846 (#3847)<br>\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)<br>\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)<br>\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833<br>\n - Rebuild translations (#3842)<br>\n - UI - Favicon use lazy load for faster rendering<br>\n - Adding more tests and Watch object improvements (#3841)<br>\n - Improved watch global settings handling (#3839)<br>\n - New datastore message should be warning not critical<br>\n - Improving upgrade path<br>\n - History length limit size option (#3834)<br>\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)<br>\n - Favicon path - cache results<br>\n - UI - Backups tab - styling fix<br>\n - Styling fix for &#34;backups&#34; tab Re #3821<br>\n - UI- Fix possible bug adding tags in quickwatch form<br>\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)<br>\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)<br>\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)<br>\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)<br>\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)<br>\n - UI - Move Default Proxy selection back to &#34;General&#34; tab<br>\n - API - Notification URLs werent always being validated (#3812)<br>\n - Remove deprecated call to strtobool<br>\n - UI - Make watch tags link elements (#3813)<br>\n - test tweak<br>\n - DB data migration upgrade fixes (#3811)<br>\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)<br>\n - Improved catching of errors/exceptions in Browser Steps steps&nbsp;&nbsp;(#3808)<br>\n - Improving default settings for remote reverse proxies (#3806)<br>\n - CLI extra options,&nbsp;&nbsp;&#34;batch mode&#34; see `--help` allows re-checking and adding watches from the CLI (#3802)<br>\n - Update messages.po // German (#3797)<br>\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)<br>\n<br>\n - 0.52.9<br>\n - Memory management improvements&nbsp;&nbsp;for large screenshots, Brotli snapshot improvements (#3798)<br>\n - Updating site.webmanifest for PWA usage<br>\n - Use credentials to fetch web manifest (#3790)<br>\n - Make language selection sticky and provide a way to return back to default auto-detect&nbsp;&nbsp;#3792 (#3795)<br>\n - Element locking &#39;off&#39; by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)<br>\n - Rebuilding language translation files<br>\n - Update French translation (#3788)<br>\n - Open github link on new tab (#3791)<br>\n - Update messages.po // German &#34;From&#34; (#3793)<br>\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794<br>\n<br>\n - 0.52.8<br>\n - Memory - Favicon reader had a memory leak,&nbsp;&nbsp;Restart fetch workers between jobs, misc tweaks&nbsp;&nbsp; (#3787)<br>\n - API -&nbsp;&nbsp;Validation improvements (#3782)<br>\n - i18n - zh traditional chinese autodetect from browser fix<br>\n - UI - Fixes for search dialog #3778 (#3781)<br>\n<br>\n - 0.52.7<br>\n - Fix zh PO duplicates and complete new translations. (#3773)<br>\n - Lots of translation updates (#3772)<br>\n - UI - Global &#34;mute&#34; and &#34;pause&#34; buttons on main menu, move &#34;Backups&#34; to &#34;Settings&#34; (#3769)<br>\n - API &amp;amp; UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)<br>\n - Non blocking improvements (#3767)<br>\n - Improvements to deterministic fix (false triggers) (#3766)<br>\n - Run &#34;clear all history&#34; in background thread to prevent blocking (#3765)<br>\n - Test - Adding missing test<br>\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)<br>\n - Language updates (#3764)<br>\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.<br>\n - UI - Fixing link to scheduler help/tutorial page.<br>\n - Manual update of DE language (and recompile all languages)<br>\n - Recompile CSS<br>\n - UI - Mobile - Empty page watches message and layout improvements (#3760)<br>\n - UI - CSS - Give dark-mode switching a soft transition<br>\n - Edit - More reliable fetch of watch on test (usually affects tests)<br>\n - Manual polish for several translations in the zh locale. (#3757)<br>\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.<br>\n - Languages - Recompile languages, small fix for &#39;de&#39;.<br>\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)<br>\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)<br>\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)<br>\n - 0.52.6<br>\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)<br>\n - UI - Show queue size above watch table in realtime<br>\n<br>\n - 0.52.5<br>\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)<br>\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo<br>\n - i18n: Update zh_Hant_TW translations (#3745)<br>\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)<br>\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737<br>\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)<br>\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)<br>\n<br>\n - 0.52.4<br>\n - Fixing Traditional Chinese locale mapping #3737 (#3738)<br>\n - Languages - Pypi/pip package was missing translations<br>\n<br>\n - 0.52.3<br>\n - UI - Groups - Adding &#39;Recheck&#39; button from groups overview page<br>\n - Minor playwright memory cleanup improvements (#3736)<br>\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)<br>\n<br>\n - 0.52.2<br>\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.<br>\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)<br>\n - UI - Language modal - flag icons should be round<br>\n<br>\n - 0.52.1<br>\n - Development branch merge into release/master<br>\n - Adding test for #3720<br>\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)<br>\n - Update README.md - Info about setting up different viewport sizes<br>\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)<br>\n - API - Watch get, retry watch data if watch dict changed (more reliable)<br>\n - Notification debug log - Use locale of system for dates/times<br>\n - Misc small HTML Validation fixes (#3704)<br>\n<br>\n - 0.51.4<br>\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)<br>\n - Bump actions/checkout from 5 to 6 in the all group (#3651)<br>\n - Specify UTF-8 encoding for xpath_element_js (#3650)<br>\n - Update playwright library to 1.56<br>\n<br>\n - 0.51.3<br>\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)<br>\n<br>\n - 0.51.2<br>\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.<br>\n<br>\n - 0.51.1 Fixing semver version number<br>\n<br>\n - 0.51.01<br>\n<br>\n - 0.51.00<br>\n - UI - Minor text fix for anon history access<br>\n - RSS per watch tweaks (#3635)<br>\n - RSS Feed per watch - Setting order (newest changes first) (#3634)<br>\n - UI - Moving &#39;RSS&#39; options to its own settings tab, RSS - Adding watch history length&nbsp;&nbsp;(#3633)<br>\n - RSS per group! (#3632)<br>\n - UI - Move &#39;Jitter seconds&#39; settings tab from &#34;General&#34; to &#34;Fetching&#34; global Settings.<br>\n - README typo fix and ignore files for emacs style backups<br>\n - RSS feeds for a single watches!<br>\n - Always backup JSON DB on new versions as well as the existing between updates.<br>\n<br>\n - 0.50.43<br>\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms&nbsp;&nbsp;#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<br>\n - Adding data sanity checks across restarts (#3629)<br>\n<br>\n - 0.50.42<br>\n - Revert &#34;Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)&#34;<br>\n<br>\n - 0.50.41<br>\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)<br>\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)<br>\n<br>\n - 0.50.40<br>\n - Page &amp;lt;title&amp;gt; should only be captured on HTML documents (#3608)<br>\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)<br>\n - Real time UI - Remove polling thread for updates - it&#39;s all done realtime by signals (#3603)<br>\n - Watch history - Don&#39;t rescan whole history.txt when looking up a timestamp &amp;lt;-&amp;gt;filepath (#3602)<br>\n - Datastore - Use `orjson` for faster saves (#3601)<br>\n - Scheduler - Saving a couple of CPU cycles in logging strategy<br>\n<br>\n - 0.50.39<br>\n - Time scheduler - Remove cache on time lookup<br>\n - Tests - Adding extra placemarker tests (#3592 #3591 )<br>\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)<br>\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)<br>\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)<br>\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)<br>\n - API - Adding better explanation and usage of History API, bumping doc versions.<br>\n - API - Rebuilding HTML docs<br>\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.<br>\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)<br>\n<br>\n - 0.50.38<br>\n - Improved send test notification handling (#3579)<br>\n<br>\n - 0.50.37<br>\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -&amp;gt; `&amp;lt;br&amp;gt;` etc (#3577) #3538 #3576<br>\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)<br>\n<br>\n - 0.50.35<br>\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573<br>\n - API - Updating index.html of the documentation<br>\n - Optimisations to GitHub test flow<br>\n<br>\n - 0.50.34<br>\n - Fixes to notification &#39;`Send test notification`&#39; (#3571)<br>\n - HTML Notification - Adjusting font to rem size<br>\n - Run all pytests in parallel (#3569)<br>\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)<br>\n - Build/test - Parallel test jobs for faster testing (#3568)<br>\n - Handle `format=` in apprise URLs (#3567)<br>\n - Adding small amount of cache to common functions (#3565)<br>\n - CVE-2025-62780 - Stored XSS in Watch update via API<br>\n<br>\n - 0.50.33<br>\n - Fixing wrong notification type in &amp;lt;select&amp;gt; that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)<br>\n - HTML - Shorten whitespace around timezone names<br>\n - Update 21 for #3496 - Fixing update of timezone setting<br>\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556<br>\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)<br>\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)<br>\n - Build - Actions / Bump the all group with 2 updates (#3550)<br>\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)<br>\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)<br>\n<br>\n - 0.50.32<br>\n - Tests - API - Import - Removed &#39;content-type&#39;: &#39;text/plain&#39; from the test because this should be assumed.<br>\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542<br>\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)<br>\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)<br>\n - Notifications - `post://&#39;, `put://` etc - Catch and show errors and where possible (#3543)<br>\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)<br>\n<br>\n - 0.50.31<br>\n - Changes to colors HTML notification (small contrast between &#39;changed&#39; and &#39;removed&#39; etc) (#3540)<br>\n - tgram:// and discord:// - Small fix for line breaks<br>\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)<br>\n<br>\n - 0.50.30<br>\n - Notifications fixes (#3534) #3531 #3530 #3529<br>\n - Template - Adding `|regex_replace` Re #3501 (#3536)<br>\n - Be sure that default namespaces are registered (#3535)<br>\n<br>\n - 0.50.29<br>\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)<br>\n - Notifications - Refactor/cleanup notification handling and rename &#39;Markdown&#39; to &#34;Markdown to HTML&#34; to make more sense. (#3527) Re #3526 -<br>\n - UI - Fix watch table striping on delete #3523<br>\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)<br>\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)<br>\n - Update beautifulsoup4 requirement (#3471)<br>\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)<br>\n<br>\n - 0.50.28<br>\n - Email notification format fixes (#3525)<br>\n - Empty &#34;ignore text&#34; lines could break ignore text and prevent changes from being detected (#3524)<br>\n<br>\n - 0.50.27<br>\n - Fix error handling for first empty filter response (#3516)<br>\n<br>\n - 0.50.26<br>\n - pip build - Improving fix for #3509, Adding automated test for #3509<br>\n<br>\n - 0.50.25<br>\n - pip build - Be sure to include API spec (#3511)<br>\n - Improved watch delete (#3510)<br>\n - Notification service improved failure alerts for filter missing + browsersteps&nbsp;&nbsp;problems (#3507)<br>\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)<br>\n<br>\n - 0.50.24<br>\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)<br>\n<br>\n - 0.50.23<br>\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now &#39;Europe/London&#39;, &#39;%Y-%m-%d&#39; %}` etc (#3496)<br>\n<br>\n - 0.50.22<br>\n - Testing - Adding test for requests timeout setting #975<br>\n - UI - Add missing &#39;requests timeout in seconds&#39; field to main settings, Re #975<br>\n - UI - Proxy and external browser settings URL validation (#3494)<br>\n - Move proxy default selection to proxy tab<br>\n - Build - Splitting memory report (#3493)<br>\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)<br>\n<br>\n - 0.50.21<br>\n - Adding &#39;RSS reader mode&#39; (see main Settings) (#3488)<br>\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends &#34;text/xml&#34; instead of the &#34;application/atom+xml&#34; header (#3487)<br>\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)<br>\n - No need to reformat/reprocess content in the case that no filters were found&nbsp;&nbsp;(#3484,&nbsp;&nbsp;#3483)<br>\n<br>\n - 0.50.20<br>\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)<br>\n<br>\n - 0.50.19<br>\n - Test speedup - remove common calls for function calls (#3477)<br>\n - Reducing memory usage (#3476)<br>\n - Refactoring text/html difference processor (#3475)<br>\n<br>\n - 0.50.18<br>\n - Always follow plaintext header over the actual content type if its available (#3473) #3472<br>\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)<br>\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)<br>\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)<br>\n<br>\n - 0.50.17<br>\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465)&nbsp;&nbsp;#3462&nbsp;&nbsp;#3391<br>\n - Dependabot tweaks<br>\n<br>\n - 0.50.16<br>\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)<br>\n<br>\n - 0.50.15<br>\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)<br>\n - Filters - Adding &#34;Strip ignored lines&#34; in output option to filters (#3449)<br>\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)<br>\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8<br>\n - Build - Pinning library versions to fix tests<br>\n - Notifications - Upgrade Apprise 1.9.4 (#3443)<br>\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)<br>\n - UI - Implementation of unread counter - adding test<br>\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)<br>\n<br>\n - 0.50.14<br>\n - Time interval field - Extra validation improvements and tests (#3432)<br>\n - UI - Fixing HTML &amp;lt;title&amp;gt; versus custom title settings display in overview (#3430) #3429<br>\n - API - Adding page title link, bumping docs (#3431)<br>\n - &#34;Time between check&#34; field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)<br>\n<br>\n - 0.50.13<br>\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)<br>\n - Always extract page &amp;lt;title&amp;gt;, `{{watch_title}}` added to notification body tokens (#3415)<br>\n - UI - Correctly set &#39;checking now&#39; status badge on edit page<br>\n - Add noindex meta (#3416)<br>\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)<br>\n - Restock - Add &#39;nicht mehr lieferbar&#39; to stock status checks (#3410)<br>\n<br>\n - 0.50.12<br>\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)<br>\n - UI - Added &#34;unread&#34; view filter (#3393)<br>\n - Enable &#34;last_viewed&#34; field in the watch API. (#3403)<br>\n - Update docker-compose.yml - Include mac port info warning<br>\n<br>\n - 0.50.11<br>\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)<br>\n - Cryptography library - pinning version<br>\n - UI - Improving &#34;real-time updates offline&#34; message<br>\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397<br>\n - Update api-spec.yaml<br>\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)<br>\n - API Docs - Improve descriptions<br>\n - API Doc rebuild<br>\n - Bump API Docs slightly<br>\n - Update settings.html text<br>\n - API - Use OpenAPI docs (#3384)<br>\n - Refactor API Documentation (#3383)<br>\n - Updating API documentation<br>\n - Favicons in list - Prefer best/highest quality (#3351)<br>\n<br>\n - 0.50.10<br>\n - API - Recheck by tag #3356 (#3378)<br>\n - Cleanup empty queue messages Re #3376 (#3377)<br>\n<br>\n - 0.50.9<br>\n - Bump actions/checkout from 4 to 5 in the all group (#3373)<br>\n - Refactoring queue handling (#3363)<br>\n - Build - rPi - Cryptography lib not needed (#3365)<br>\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)<br>\n - Conditions &amp;amp; API - Fix set Conditions by API&nbsp;&nbsp;(#3349)<br>\n<br>\n - 0.50.8<br>\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)<br>\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)<br>\n - Re #3337 - UI - Various fixes for &#39;Extract Data&#39; (#3341)<br>\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321<br>\n<br>\n - 0.50.7<br>\n - UI - Set default favicon, handle default &#39;not set&#39; for new/updated installations<br>\n - UI - Set default favicon, offer option to disable favicons (#3316)<br>\n - README - Updating screenshot (with better cropping)<br>\n - README - Updating screenshot<br>\n - UI - Mobile CSS tweaks<br>\n - UI - Mobile - Small tidyups for mobile use<br>\n - UI - CSS - Modernising stylesheet build<br>\n<br>\n - 0.50.6<br>\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)<br>\n - Fixing ARMv7 docker image support for older devices (#3311)<br>\n - UI - Favicons - Try /favicon.ico if no other was specified in the document<br>\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime<br>\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.<br>\n - UI - Lazy load favicons so it doesnt block realtime and other operations<br>\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)<br>\n - UI - Sort list by Running or Paused #3284 (#3294)<br>\n - Similarity condition - Skip generating stats for very large documents in the &#39;Edit&#39; page (#3296)<br>\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the &#39;history&#39; page automatically (#3293)<br>\n - Update stock-not-in-stock.js Added &#39;backorder&#39; and &#39;more on order&#39;<br>\n - Update README.md<br>\n<br>\n - 0.50.5<br>\n - Update README-pip.md<br>\n - Update README.md<br>\n - Update README.md<br>\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)<br>\n - Conditions - Fixing &#34;Does NOT contain&#34; condition (#3279 / #3272 )<br>\n - Update README.md<br>\n - Update LICENSE<br>\n<br>\n - 0.50.4<br>\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list<br>\n - Better path cross-platform file handling (#3265)<br>\n<br>\n - 0.50.3<br>\n - Realtime UI - Prefer websocket then fallback to &#39;polling&#39; mode, increase reconnecting retries.<br>\n - UI - Fixing Watch &#39;set viewed&#39; by tag #3253 (#3258)<br>\n - UI - Always unset &#39;unviewed&#39; state when &#39;[History]&#39; button&nbsp;&nbsp;is pressed from watch overview list #3243<br>\n - UI - Tweak UI option text description for &#39;Open history page in new tab&#39; setting<br>\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)<br>\n - Realtime UI - Delete watch should update in realtime ( #3255 )<br>\n - UI - Quick watch add form color fix<br>\n - Application via HTTPS support -&nbsp;&nbsp;Adding SSL setup and automated test (#3247) (#3252)<br>\n - Browser Steps - Fix for `source:` URLs fix (#3254)<br>\n - UI - Restyle of &#34;quick watch add form&#34; above watchlist<br>\n - UI - Don&#39;t restrict page content box to 80% width (#3251)<br>\n - UI - #3236 fix duplicate icon in watchlist<br>\n - Data store - use original formatted data write<br>\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)<br>\n - UI - Realtime - Add realtime warning to page if server goes offline<br>\n - Browser Steps - Better support for sites that redirect on click/login etc<br>\n - Restock detector - Update texts (#3234)<br>\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)<br>\n - Build test - Build test for platforms in parallel (#3229)<br>\n - BrowserSteps - remove unsupported exception class<br>\n<br>\n - 0.50.2<br>\n - 0.50.1<br>\n<br>\n<br>\n - 0.50.01<br>\n - UI - Adding missing icons lib<br>\n - Use pip build cache from inside Dockerfile (#3228)<br>\n - UI - Also uncheck &#39;check all&#39; checkbox for group operations in realtime mode<br>\n - UI - Real time - checkbox operations now realtime without reload<br>\n - UI - Revert icon changes<br>\n - Building - Use GHA layer caching (#3227)<br>\n - UI - Realtime - Fixing &#39;last_changed&#39; status re #3224<br>\n - Realtime UI - Socketio tweaks and refactor (#3220)<br>\n - Code - Fix dep warning (#3221)<br>\n - Realtime UI - Reducing log output<br>\n - UI - Reword restock detector plugin description<br>\n - UI - Remove incorrect error text<br>\n<br>\n - 0.49.18<br>\n - Realtime UI updates via WebSocket (#3183)<br>\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)<br>\n - UI - Update &#39;Browser Steps&#39; UI text<br>\n - Code - Remove unused f-strings (#3209)<br>\n - Use logger.debug for playwright console logs (#3201)<br>\n<br>\n - 0.49.17<br>\n - Resolve warnings of bs4 library (#3187)<br>\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)<br>\n<br>\n - 0.49.16<br>\n - Fixes to ensure proxy errors are handled correctly (#3168)<br>\n - UI - Custom headers should have validation (#3172)<br>\n - Update selenium library (#3170)<br>\n - Restock detection - adding new string<br>\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)<br>\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)<br>\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)<br>\n - Improved global ignore test (#3140)<br>\n - Update docker-compose.yml (#3149)<br>\n - Small fix for xpath element scraper (#3145)<br>\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108<br>\n - Browser Steps - &amp;lt;Select&amp;gt; by Option Text - #1224, #1228 (#3138)<br>\n - Browser Steps - error reporting and session shutdown improvements (#3137)<br>\n<br>\n - 0.49.15<br>\n - Visual Selector &amp;amp; Browser Steps - Always recheck if the data/screenshot is ready under &#34;Visual Selector&#34; tab after using Browser Steps (#3130)<br>\n - App logs - Send TRACE and INFO logs to stdout (#3051)<br>\n - Development: introduce Ruff as linter/formatter (#3039)<br>\n - Updating restock texts (#3124)<br>\n - Only add screenshot warning if capture was greater than trim size (#3123)<br>\n<br>\n - 0.49.14<br>\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)<br>\n - docs: Update reference URL (#3119)<br>\n - UI - Fix to edit and groups template<br>\n - Updating API documentation<br>\n - Undo forced selenium headless mode, small refactor (#3112)<br>\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)<br>\n - Memory management -&nbsp;&nbsp;Run HTML to text in sub process, a few more cleanups&nbsp;&nbsp;to playwright (#3110)<br>\n - UI Edit/Stats - Add levenshtein distance info, explains how &#34;different&#34; the last two snapshot are (#3109)<br>\n<br>\n - 0.49.13<br>\n - API - Added notifications API endpoints (#3103)<br>\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)<br>\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)<br>\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)<br>\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)<br>\n - Update other methods to use updated screenshot handler (#3098)<br>\n - Memory fixes for large playwright screenshots (#3092)<br>\n - Filters - Support multi line regex&nbsp;&nbsp;(#2889)<br>\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)<br>\n - README.md update - Including blurb about &#39;conditions&#39;<br>\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)<br>\n - Make chrome browser headless when checking the site with selenium (#3095)<br>\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)<br>\n - UI - &#34;Recheck all&#34; should also queue most overdue first&nbsp;&nbsp;(same like automatic scheduler) (#3087)<br>\n - Groups - Including &#34;Extract text&#34;, &#34;Text to ignore&#34;, &#34;Trigger text&#34; and &#34;Text that should not be present&#34; filters<br>\n<br>\n - 0.49.12<br>\n<br>\n - 0.49.11<br>\n<br>\n - 0.49.10<br>\n - Update README.md<br>\n - UI - &#34;Conditions&#34; section, making the Conditions setup table work better on mobile/responsive<br>\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)<br>\n - Python 3.11 container base (#3077)<br>\n - Use lowercase static asset filenames<br>\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)<br>\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)<br>\n - Update edit.html - linking to tutorial<br>\n - Code - Tidy up lint errors (#3074)<br>\n - UI - Update edit.html- xPath support text for 1 &amp;amp; 2<br>\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)<br>\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)<br>\n - UI - Watch edit - &#34;Clone&#34; Should be &#34;Clone &amp;amp; Edit&#34; without watch history, redirect to the new edit page (#3063 #2782)<br>\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)<br>\n - UI - Tidy up support links<br>\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)<br>\n<br>\n - 0.49.9<br>\n - RSS Fixes and improvements - Ability to set &#34;RSS Color HTML Format&#34; in Settings, detect and filter content with bad content that could break RSS (#3055)<br>\n<br>\n - 0.49.8<br>\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)<br>\n - API - Adding &#34;Search&#34; API (#3052)<br>\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)<br>\n<br>\n - 0.49.7<br>\n - Adding Tags/Groups API (#3049)<br>\n<br>\n - 0.49.6<br>\n - API Access should still work even when UI Password is enabled (#3046) #3045<br>\n<br>\n - 0.49.5<br>\n - Template tidyup &amp;amp; UI Fixes (#3044)<br>\n - Watch history -&nbsp;&nbsp;Ensure atomic/safe history data disk writes (#3042 #3041)<br>\n - Testing - Replace Linux only &#39;resource&#39; library with cross-platform &#39;psutil&#39; library (#3037)<br>\n - Refactor code layout, add extra tests<br>\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc<br>\n<br>\n - 0.49.4<br>\n - Datastore - Always use utf-8 encoding for error text output storage<br>\n -&nbsp;&nbsp;Restock detection - Adding french keywords for out of stock items<br>\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied<br>\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)<br>\n - Browser Steps - Added new &#34;Make all child elements visible&#34; action<br>\n - Browser Steps - Added new &#34;Remove elements&#34; action<br>\n - UI - Browser Steps - &#34;Click X,Y&#34; should focus on the input field also<br>\n - UI - Browser Steps - Improving Browser Steps usability on mobile<br>\n<br>\n - 0.49.3<br>\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)<br>\n<br>\n - 0.49.2<br>\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)<br>\n - Update docker-compose.yml<br>\n - UI - More W3C HTML validation fixes<br>\n - UI - More W3C validation fixes (#2973)<br>\n - UI - Tweaks for HTML validation<br>\n - Filter - &#34;Unique lines&#34; could possibly crash if history was empty or cleared on the disk<br>\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers<br>\n - Removing deprecated docker-compose.yml version attribute (#2967)<br>\n - Update settings.html<br>\n - Browser Steps - Increasing timeout for actions and unifying timeout values<br>\n - Browser Steps - Fixing &#39;Uncheck checkbox&#39; #2958<br>\n - UI - &#34;Browser Steps&#34; tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)<br>\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)<br>\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)<br>\n<br>\n - 0.49.1<br>\n - Update stock-not-in-stock.js - Italian (#2948)<br>\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `&#34;Exception: No parsable JSON found in this document&#34; ` error) (#2947)<br>\n - Add major and minor tags for Docker release workflow (#2938)<br>\n - Adding jinja2/browsersteps test (#2915)<br>\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)<br>\n<br>\n - 0.49.00<br>\n - Update README.md<br>\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)<br>\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don&#39;t show an error was detected)(#2897)<br>\n<br>\n - 0.48.06<br>\n - Restock -&nbsp;&nbsp;Add test for new lower/higher price notification Re #2715 (#2892)<br>\n - Update integration test for &#34;linuxserver&#34; test build (#2891)<br>\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL&#39;s being double-encoded, fixes chantify:// notifications (#2868) (#2875)&nbsp;&nbsp;(#2870)<br>\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)<br>\n - &#34;Send test notification&#34; button - Easier to understand test send results, Improved error handling, code refactor (#2888)<br>\n - Improve `last_checked` vs `last_changed` time information precision (#2883)<br>\n - Update Apprise to 1.9.1 (#2876)<br>\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)<br>\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)<br>\n<br>\n - 0.48.05<br>\n - Fixing test for CVE-2024-56509 (#2864)<br>\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )<br>\n<br>\n - 0.48.04<br>\n - Windows was sometimes missing timezone data (#2845 #2826)<br>\n<br>\n - 0.48.03<br>\n - 0.48.02<br>\n - 0.48.02<br>\n - Notifications - &#34;Send test&#34; was not always following &#34;System default notification format&#34; (#2844)<br>\n - Notifications - &#34;Send test&#34; was not always following &#34;System default notification format&#34;<br>\n<br>\n - 0.48.02<br>\n - Notifications - &#34;Send test&#34; was not always following &#34;System default notification format&#34;<br>\n - Notifications - Default notification format (for new installs) now &#34;HTML color&#34; (#2843)<br>\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )<br>\n - Notifcations - Adding &#34;HTML Color&#34; notification format option (#2837)<br>\n - UI - Make &#39;tag&#39; sticky - redirect to current tag on edit or add watch (#2824 #2785)<br>\n - Notifications - Support for commented out notification URLs (#2825 #2769)<br>\n - Docs - Adding information to README.md about the new scheduler<br>\n<br>\n - 0.48.01<br>\n - UI - Fixing scheduler options<br>\n<br>\n - 0.48.00<br>\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)<br>\n - New functionality - Time (weekday + time) scheduler / duration (#2802)<br>\n - Add Turkish phrases for out-of-stock detection (#2809)<br>\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)<br>\n - Update stock-not-in-stock.js<br>\n - Python 3.13 compatibility (#2791)<br>\n - Code - Update .gitignore and .dockerignore (#2797)<br>\n - VisualSelector - Use &#39;deflate&#39; for storing elements.json, 90% file size reduction (#2794)<br>\n - UI - Show local timezone info in settings (for future functionality) #2793<br>\n - Notification - Locking paho-mqtt:// version fix<br>\n - Update COMMERCIAL_LICENCE.md<br>\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)<br>\n - Minor improvement for queue management<br>\n - Update bug_report.md<br>\n<br>\n - Security - Fix test<br>\n - Security check - improve test<br>\n - 0.47.06<br>\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set<br>\n - Update docker-compose.yml (#2767)<br>\n - Price tracker - fix for sites that supply an empty additional price (#2758)<br>\n - Testing - Pinning werkzeug (#2757)<br>\n<br>\n - 0.47.05<br>\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright<br>\n - Backups - Hide incomplete/running backups from being downloaded<br>\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)<br>\n - Filters - Process all CSS and XPath &#39;subtract&#39; selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)<br>\n<br>\n - 0.47.04<br>\n - Do not recheck &#39;paused&#39; watches on edit/save (Re #2747 #2750)<br>\n - Notification post:// get:// etc - Fixing URL encoding of headers so that &#39;+&#39; in URL is correctly parsed as &#39; &#39; (and other url-encodings) (#2745)<br>\n - #2502 - Add jinja2 template handling to request body and headers (#2740)<br>\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)<br>\n - &#34;Send test notification&#34; in &#34;Restock&#34; mode was not working correclty when restock tokens &#34;{{restock.price}}&#34; were in the notification body (#2737)<br>\n - #2727 Notifications - Fix &#34;send test notification&#34; on empty list, includes test (#2731)<br>\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)<br>\n - Filters - &#34;Block change detection when text exists&#34; should not trigger a change when the original text returns<br>\n - UI - More work on tab buttons hiding behind menu/header&nbsp;&nbsp;:-)<br>\n<br>\n - 0.47.03<br>\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)<br>\n - UI - Fix scroll offset / tab buttons hiding behind menu/header<br>\n - 0.47.02<br>\n - UI - Fix scroll offset / tab buttons hiding behind menu/header<br>\n<br>\n - 0.47.02<br>\n - UI - Fix scroll offset / tab buttons hiding behind menu/header<br>\n<br>\n - 0.47.01<br>\n - Adding missing `apprise_plugin` for pypi/pip based installs<br>\n<br>\n - 0.47.00<br>\n - Restock multiprice improvements (#2698)<br>\n - Test - Simple test for live preview<br>\n - Adding test for proxy checker/scanner (#2697)<br>\n - Fixing proxy checker (#2696)<br>\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)<br>\n - Testing - Tidyup (#2693)<br>\n - Filters &amp;amp; Text - Preview refactor/improvements (#2689)<br>\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)<br>\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header<br>\n - UI - Filters live preview - improvements to layout<br>\n - Restock - Use the scraped &#39;Not in stock&#39; product status over the metadata version (many website lie in the metadata) (#2684)<br>\n - UI - Better 40x error message (#2685)<br>\n - Visual Selector - Including &amp;lt;button&amp;gt; (#2686)<br>\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)<br>\n - Code - Small improvements in logging<br>\n - UI - CSS - Fix on sorting row wrapping issue (#2680)<br>\n - UI - Live filters preview - Better handling of watch preferences<br>\n - UI - &#34;Diff&#34; button in overview list is now &#34;History&#34; button (#2679)<br>\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)<br>\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters<br>\n - UI - Live filters preview - dark mode improvements<br>\n - UI - Improvements to text preview on mobile<br>\n - UI - Improvements to live preview of Filters text<br>\n - UI - Misc fixes for mobile styling (#2669)<br>\n - Update docker-compose.yml - Adding example for enabling change detection on local files<br>\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)<br>\n - UI - &#34;Filters &amp;amp; Triggers&#34; - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)<br>\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)<br>\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)<br>\n - Restock monitor - Only try to process restock information (like scraping for &#34;out of stock&#34; keywords) if the page was actually rendered correctly. (#2645)<br>\n - Text filters - Adding filters &#34;Trim whitespace&#34; and &#34;Remove duplicate lines&#34;<br>\n - Browser Steps - UI - Use a better flexbox layout<br>\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)<br>\n - Update AppRise notification library to 1.9.0 (#2624)<br>\n - browser_steps: add &#34;click element containing text if exists&#34; (#2629)<br>\n - Testing - Fixing Restock test #2641<br>\n - Testing - Fix false filter missing check alerts<br>\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)<br>\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)<br>\n - Small memory allocation fixes (#2625)<br>\n - Testing - locale fix for test (#2623)<br>\n - Testing/Code - Improving test reliability (#2617)<br>\n - UI - Hiding noisy info under &#39;show advanced help&#39; button (#2609)<br>\n<br>\n - 0.46.04<br>\n - Fixing restock monitor tests and tweaking docker default config example,<br>\n - Container name should be &#39;sockpuppetbrowser&#39; because its not just playwright that uses it<br>\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)<br>\n - Restock - updating texts and text offsets<br>\n - Build - Unpin jsonschema for faster builds (#2583)<br>\n - Price detection/scraping - Adding extra element training data (#2582)<br>\n<br>\n - 0.46.03<br>\n - Watch &#39;Download last snapshot&#39; link/button should give last, not first snapshot (#2576)<br>\n - Price and restock scraping - small price fix scraper (#2575)<br>\n - Browser Steps UI - Interactive UI wasn&#39;t sending headers but was when the check ran&nbsp;&nbsp;(#2551)<br>\n - Set encoding type for scraper script reader (#2574 #2568)<br>\n - Handle zero-byte/empty content responses with &#34;`[ ] Empty pages are a change`&#34; option, the same as when the HTML doesnt render any useful text (#2530)<br>\n<br>\n - 0.46.02<br>\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)<br>\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00c3\u00a9t\u00c3\u00a9 Fran\u00c3\u00a7aise du Radiot\u00c3\u00a9l\u00c3\u00a9phone (SFR) Support (#2524)<br>\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)<br>\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)<br>\n - Use #!/usr/bin/env to support virtualenv (#2518)<br>\n - Update README.md<br>\n - UI - Adding &#34;Download latest HTML snapshot&#34; from Edit Watch &amp;gt; Stats page for easier debugging (#2513)<br>\n<br>\n - 0.46.01<br>\n - UI - Fixing up &#39;test notification&#39; bug from main settings and tag settings pages #2510 (#2511)<br>\n<br>\n - 0.46.00<br>\n - Restock/Price detection - Improving text information snapshot value<br>\n - Restock - Tweaking storage of &#34;original price&#34;<br>\n - Fixing file:// file pickup&nbsp;&nbsp;- for change detection of local files (#2505)<br>\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)<br>\n - Dropping older ARM v6 support due to dependencies not having support (#2506)<br>\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)<br>\n - Restock &amp;amp; Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits<br>\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings<br>\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)<br>\n - UI - Restock/price following text cleanups<br>\n - UI - Extract &amp;lt;title&amp;gt; as title should work on all processors (#2490)<br>\n - Restock &amp;amp; Price monitor -&nbsp;&nbsp;Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list<br>\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)<br>\n - Update COMMERCIAL_LICENCE.md<br>\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software<br>\n - Adding COMMERCIAL_LICENCE.md<br>\n - Testing - Adding simple memory usage test (#2483)<br>\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)<br>\n<br>\n - 0.45.26<br>\n - Code - Fixing deprecation warning (#2477)<br>\n - UI - Visual Selector should still update when elements were not found (#2476)<br>\n - Code - Update/modernise diff.py (#2471)<br>\n - UI - Visual Selector - Multiple selections (refactor) (#2475)<br>\n - UI - Visual Selector now supports Shift+Click for multiple selections!<br>\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in &#34;CSS/JSONPath/JQ/XPath Filters&#34; include filters (#2440)<br>\n - UI - Visual Selector graphics should be centred<br>\n -&nbsp;&nbsp;Snapshot count from history was not updated in watch after using [clear history] (#2459)<br>\n - Fixing &#39;tags&#39;&#39; field from old installs (0.43.0+) could have wrong data-type causing crash<br>\n<br>\n - 0.45.25<br>\n - UI - Fixing preview/diff &#34;ignore text&#34; highlight button (refactor, didnt work in &#34;preview&#34; mode) (#2455)<br>\n - Restock detection - Updating detection texts<br>\n - UI - Mobile - Hiding empty columns<br>\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly<br>\n - Update docker-compose.yml - fix indentation re #2447<br>\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)<br>\n - Restock detection - updating texts<br>\n - UI - Fixing double punctuation in &#39;unpaused&#39; message #2435<br>\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)<br>\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)<br>\n - Filters - Implement jqraw: filter&nbsp;&nbsp;(use this to output nicer JSON format when selecting/filtering by JSON) (#2430)<br>\n - Build - fixing build warnings<br>\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt &#34;wheels&#34; for rPi devices, upgrade cryptography security library<br>\n - Prefer pythons built in &#34;importlib&#34; over pkg_resources+setuptools (#2424)<br>\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)<br>\n<br>\n - 0.45.24<br>\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)<br>\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on &#39;save&#39; (#2413)<br>\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)<br>\n - Improve testing for Python 3.10, 3.11 and 3.12<br>\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393<br>\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)<br>\n - Fetching/Requests - Fixing&nbsp;&nbsp;user agent header overrides per-watch of global settings (#2409)<br>\n - Code - improving unique key fix for history database handler (#2402)<br>\n - UI - &#39;Mark all viewed&#39; button should not show when all viewed (#2399)<br>\n - Fixing build test - Adding small delay (#2397)<br>\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)<br>\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393<br>\n - UI - Preview single snapshot - Date and button fixes (#2389)<br>\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)<br>\n<br>\n - 0.45.23<br>\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)<br>\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)<br>\n - Fix overflowing text<br>\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)<br>\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)<br>\n - Testing - Fixing JSON test<br>\n - UI - Mobile - quick watch form element fixes<br>\n - UI - CSS - Remove gradient border, it did not add much to the design #2377<br>\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)<br>\n - Notifications -&nbsp;&nbsp;Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)<br>\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)<br>\n - Browser Steps - Fixing &#34;goto site&#34; step #2330 #2337 (#2364)<br>\n - Crash on older CPU -&nbsp;&nbsp;Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )<br>\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint<br>\n - UI - Refactor of the Recheck Time Settings, Added &#34;Use default recheck time&#34; checkbox and refactor/simplify system handling (#2362)<br>\n - UI - Search should scan/search error messages (#2353)<br>\n - UI - &#39;stats&#39; tab should show what the server-type detected is ( #2348 )<br>\n - Update README.md<br>\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)<br>\n<br>\n - 0.45.22<br>\n<br>\n - 0.45.21<br>\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags<br>\n - UI - Error text on exception should contain the word Exception (#2322)<br>\n<br>\n - 0.45.20<br>\n - Bug fix - further work on&nbsp;&nbsp;lxml filter extract (#2313 #2312 #2317)<br>\n<br>\n - 0.45.19<br>\n - Bug fix for newer lxml module - module &#39;lxml.etree&#39; has no attribute &#39;_ElementStringResult&#39; - reimplement _ElementStringResult (#2313 #2312)<br>\n<br>\n - 0.45.18<br>\n - UI - Adding UI notice if watch has group options set (#2311 #2307)<br>\n - dependabot - automatically follow apprise<br>\n - &#34;Send Test Notification&#34; - In &#34;Group&#34; settings form it should not fallback to the system wide notifications when sending a test if nothing is set.<br>\n - &#34;Send Test Notification&#34; - Now provides better feedback and works with the actual values in system settings form<br>\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)<br>\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243<br>\n - UI - Remove unique check for URLs entered on the &#34;quick watch add&#34; form ( #2286 #2292 )<br>\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)<br>\n - &#34;Send Test Notification&#34; button&nbsp;&nbsp;from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )<br>\n<br>\n - 0.45.17<br>\n - UI - Add helper note<br>\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters<br>\n - Update contributing documentation for discontinuation of `dev` branch (#2272)<br>\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)<br>\n - Notifications - Updating apprise version, pinning&nbsp;&nbsp;mqtt:// to compatible version (#2242)<br>\n<br>\n - 0.45.16<br>\n - Pip build - content fetchers package was missing<br>\n<br>\n - 0.45.15<br>\n - Updating restock detection texts<br>\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)<br>\n - UI - Overview list shortcut button - Ability to reset any previous errors<br>\n - Chrome Extension - Adding link and install information from the API page<br>\n - Chrome Extension - Adding link in README.md to the webstore<br>\n - Chrome Extension - Adding callout to UI<br>\n - Import - Fixed &#34;Include filters&#34; option (fixed typo on select) (#2232)<br>\n - Updating restock detection texts<br>\n - Restock detection - Improving test for restock IN STOCK -&amp;gt; OUT OF STOCK (#2219)<br>\n - Puppeteer - remove debug hook<br>\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )<br>\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)<br>\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible<br>\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper<br>\n - Fetching - Puppeteer - Adding more debug/diagnostic information<br>\n - Update stock-not-in-stock.js<br>\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)<br>\n - Code - Remove whitespaces in visual selector elements config<br>\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)<br>\n - Update stock-not-in-stock.js<br>\n - Fetching pages - Custom browser endpoints should not have default proxy info added<br>\n - Puppeteer - fixing wait times<br>\n - Puppeteer - more improvements to proxy and authentication<br>\n - Puppeteer - client fixes for proxy and caching (#2181)<br>\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)<br>\n - Puppeteer fetch - fixing exception names<br>\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)<br>\n - Alpine linux build - adding JPEG development headers to fix build errors<br>\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)<br>\n - Fetching - Prefer to use SockPuppetBrowser (#2163)<br>\n<br>\n - 0.45.14<br>\n - Bug fix -&nbsp;&nbsp;fix missing default var (#2162/ #2118/ #2122 )<br>\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)<br>\n - Restock detection - Update stock-not-in-stock.js (NL)<br>\n - New text filter - Sort text alphabetically filter (#2153)<br>\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)<br>\n - Record notification count and show in [stats] tab (#2150)<br>\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)<br>\n - UI - Show error/warning when trying to compare the same version<br>\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)<br>\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565<br>\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)<br>\n - Testing - General test workflow improvements (#2144)<br>\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)<br>\n - Notifications - skip empty notification URLs from being processed (#2138)<br>\n - UI - Filters &amp;amp; Triggers - Adding example for keyword matching in a line<br>\n - RSS - Adding performance stats<br>\n - Notification - logging - adding performance information for processing time of notifications #327<br>\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)<br>\n - Logging - Adding extra debug logging to change detection (#2136)<br>\n - Fetcher -&nbsp;&nbsp;Improve status_code logging (#2130 #2122)<br>\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)<br>\n - Restock tweaks - use a single regex, tidy up height detection (#2125)<br>\n - Notification - Templates - Adding an example of how to use URL encoding with tokens<br>\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads<br>\n - Build maintenance&nbsp;&nbsp;- dependabot - Bump the all build helpers (#2121)<br>\n - Enable dependabot for github-actions (#2119)<br>\n - Update docker-compose.yml<br>\n<br>\n - 0.45.13<br>\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/&amp;lt;uuid&amp;gt;/history` @rozpuszczalny<br>\n - Test - tidy up backup test (#2117)<br>\n - Adding contributors section (#2116)<br>\n - Logging loguru output tweaks (#2112)<br>\n - Support Loguru as a logger (#2036)<br>\n - Update stock-not-in-stock.js texts<br>\n - Test - Adding extra test for HTML output in emails ( #2103 )<br>\n - Update README.md<br>\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)<br>\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)<br>\n - Browser Steps - Fixing &#34;&#39;Response&#39; object is not subscriptable&#34; where quotes were used in connection URL&nbsp;&nbsp; - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)<br>\n - Added OPTIONS HTTP method (#2094)<br>\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)<br>\n<br>\n - 0.45.12<br>\n - 0.45.11<br>\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)<br>\n - Update README.md<br>\n - Removing heroku support as its no longer free<br>\n - PyPi package build fixes (#2084)<br>\n - Adding PyPi pip package publisher script<br>\n<br>\n - 0.45.10<br>\n - Update README.md - Remove deprecated docker-compose (now docker compose)<br>\n - Browser Steps - General error handling improvements (#2083)<br>\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)<br>\n - UI - [Send test notification] - Refactor to use all tokens&nbsp;&nbsp;like a real watch and Notification Body+Title from UI value (#2079)<br>\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support.&nbsp;&nbsp;(#2075)<br>\n - Restock detection - &#34;In stock&#34; should be None/&#34;Not yet checked&#34; by default (#2069)<br>\n - Restock detection - updating texts<br>\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don&#39;t switch to custom puppeteer mode if external browser URL is active (#2068)<br>\n<br>\n - 0.45.9<br>\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)<br>\n - Testing: Improve application signal handling test coverage (#2052)<br>\n - Update docker-compose.yml<br>\n - Restock detection - Update stock-not-in-stock.js strings (#2032)<br>\n - API - Updating documentation<br>\n - Update README.md<br>\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)<br>\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)<br>\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)<br>\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser<br>\n<br>\n - 0.45.8.1<br>\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)<br>\n - UI - Fix - Edit Watch &#39;Show advanced options&#39; should fire at page load to show you whats possible<br>\n<br>\n - 0.45.8<br>\n - Restock detector - adding more detection strings<br>\n - UI - remove incorrect label<br>\n - UI - &#34;Add new watch&#34; URL at main input box should always grow to match the viewport<br>\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)<br>\n - UI - &#39;Request body&#39; section disappears after switching from &#39;Playwright&#39; to &#39;System settings default&#39; and back on &#39;Request&#39; tab - Fixed #1449<br>\n - Browser Steps - Adding validation for &#34;Click X,Y&#34; step<br>\n - API - Make sure the watch &#34;is viewed&#34; attribute is correctly represented in the API output (#2009)<br>\n - Update playwright fetcher library and API calls<br>\n - Testing - Improve PDF text change detection tests (#1992)<br>\n - UI - Clicking the &#34;[Diff]&#34; link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)<br>\n - Visual Selector - xPath handling misc fixes (#1976)<br>\n - Fix build issue<br>\n - feature: Support XPath2.0 to 3.1 (#1774)<br>\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using &#34;scraping browsers&#34;/&nbsp;&nbsp;etc) (#1943)<br>\n - API/UI - Button to regenerate API key (#1975 / #1967)<br>\n - Code refactor for fetchers (#1941)<br>\n<br>\n - 0.45.7.3<br>\n - Build - update docker container cache setup<br>\n<br>\n - 0.45.7.2<br>\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)<br>\n - Revert &#34;Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)&#34; (#1964)<br>\n<br>\n - 0.45.7.1<br>\n - Build: python libraries - pinning more libraries (#1962)<br>\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)<br>\n - Pip builder - ignore proxy test data if it exists<br>\n<br>\n - 0.45.7<br>\n - UI - Fixing issue where search box JS interfered with page render when logged out<br>\n<br>\n - 0.45.6<br>\n - UI - Adding support-us widget &amp;lt;3 (#1956)<br>\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)<br>\n - Update README.md - Adding import information<br>\n - Upgrade playwright browser library (#1942)<br>\n - Update docker-compose.yml - playwright version should be the same as in the automated tests<br>\n - Import - Improved Wachete Excel XLS import support for &#34;dynamic wachet&#34; (sets correct state of using chrome browser or not) column (#1934)<br>\n - Refactor Excel / wachete import, extend tests (#1931)<br>\n - Build - Upgrading pip packages (#1915)<br>\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)<br>\n - Docker build - upgrade image to &#34;bookworm&#34; debian version - fix glibc mismatch (#1918)<br>\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)<br>\n - Nice format stats (comma sep)<br>\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)<br>\n<br>\n - 0.45.5<br>\n - BrowserSteps - Wrong text taken from browser steps&nbsp;&nbsp;(#1911)<br>\n<br>\n - 0.45.4<br>\n - Code cleanup - Browser Steps<br>\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)<br>\n - Text Filters - &#34;Extract Text&#34; filter was not being error checked properly when using a RegEx (#1902)<br>\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)<br>\n - UI - &#34;With errors&#34; tag/button should always show the current tag error count<br>\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)<br>\n - Upgrade selenium to 4.14.0 (latest) (#1783)<br>\n - UI - Don&#39;t show search icon when logged out (#1896)<br>\n - UI - Adding handy &#34;limit to watches with errors&#34; button (#1886)<br>\n - UI - Viewing text differences - Tweaks to &#34;Jump to next change&#34; button<br>\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)<br>\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)<br>\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868<br>\n - UI - Adding [stats] tab to watch Edit page (#1880)<br>\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)<br>\n - RSS fetch - RSS field &amp;lt;title&amp;gt; was not rendering as text correctly, added workaround #1879<br>\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)<br>\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)<br>\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)<br>\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860<br>\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style<br>\n - Testing - Improve xPath tests (#1863)<br>\n - UI - Fixing jump to next difference button after refactor<br>\n - UI - Updating proxy tip link<br>\n - UI - Adding watch label/title to [edit] page title (#1858)<br>\n - Documentation - Add note that playwright is not supported on ARM type devices #1856<br>\n - UI - Difference page - added &#39;title&#39; to each change for nice mouse-over information about when the change occured<br>\n - UI - Difference page - Tweak &#39;preview&#39; page invite text<br>\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)<br>\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find<br>\n - System - No need to run updates on fresh installs (#1854)<br>\n - UI - Proxy configuration helper notes improvements<br>\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)<br>\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies<br>\n<br>\n - 0.45.3<br>\n - Update README-pip.md<br>\n - Update README.md<br>\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)<br>\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)<br>\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)<br>\n - Update README.md<br>\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser<br>\n - BrowserSteps - &amp;lt;input&amp;gt; of type &#39;number&#39; should use &#39;enter text in field&#39;<br>\n - Restock detect - bumping texts for restock detection<br>\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image<br>\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)<br>\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)<br>\n - Building application - Upgrade test workflows to latest versions (#1817)<br>\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)<br>\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)<br>\n - UI - More precise text to describe &#34;current_snapshot&#34; notification token<br>\n<br>\n - 0.45.2<br>\n - Code/Test - Improve testing for creating backups<br>\n - UI - Re-order notification field settings<br>\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link<br>\n - UI - Notifications - Tweak discord help text<br>\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)<br>\n - UI - &#34;recheck all&#34; button should ignore blank/empty &#34;tag&#34; setting when set<br>\n - Update README.md<br>\n - UI - Fix spelling error<br>\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)<br>\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)<br>\n - Ability to select &#34;No proxy&#34; for a watch when you have proxy&#39;s configured<br>\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)<br>\n - Update README.md<br>\n - UI - Fixing update for sort by &#34;date created&#34; or &#34;#&#34; in watch overview table ( #1775 )<br>\n - Add &#39;diff_patch&#39; notification body token - This will allow the diff to be generated in the &#34;unified patch format.&#34; (#1765)<br>\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)<br>\n<br>\n - 0.45.1<br>\n - UI - Fixing open/broken HTML which was causing some buttons to not display<br>\n<br>\n - 0.45<br>\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)<br>\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)<br>\n - Fix - Regular Expression text in&nbsp;&nbsp;`ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)<br>\n - Fix typo in README.md (#1759)<br>\n - UI - &#34;Test notification&#34; button in &#34;Group Tag&#34; settings page was broken due to missing variable #1753<br>\n - UI - Clicking &#39;ignore text&#39; when highlighting text should clear the preview text button/area. #1754<br>\n - Update documentation - How to set number of concurrent fetchers<br>\n<br>\n - 0.44.2<br>\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)<br>\n - Update README.md<br>\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)<br>\n - Updating in app links<br>\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like &#34;localhost&#34; with BLOCK_SIMPLEHOSTS setting (#1732)<br>\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)<br>\n<br>\n - 0.44.1<br>\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)<br>\n - UI - Fixing darkmode switch icon<br>\n<br>\n - 0.44<br>\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.<br>\n - API - Updating API description for handling a single watch<br>\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems<br>\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)<br>\n - Browser Steps - When cleaning up old screenshots, check the file exists<br>\n - Scan/Recheck proxies - Report filter not found as &#34;OK&#34; but with warning<br>\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)<br>\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)<br>\n<br>\n - 0.43.2<br>\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)<br>\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)<br>\n<br>\n - 0.43.1<br>\n - Bug fix - Notification settings were not cascading from global -&amp;gt; tags -&amp;gt; watch correctly in some cases (#1654)<br>\n - Bug - Fix watch clone (#1647)<br>\n - UI - Dont allow empty tag names (#1641)<br>\n<br>\n - 0.43<br>\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox<br>\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups<br>\n - UI - Fixes to dark mode toggle (#1629)<br>\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)<br>\n - Code - Adding CI test for search (#1626)<br>\n<br>\n - 0.42.3<br>\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)<br>\n - README - Update links to new website<br>\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)<br>\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)<br>\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)<br>\n - UI/Fetching - Update &#34;Filter not found&#34; message to be more explanatory/helpful (#1602)<br>\n - Restock monitor - Updating texts for tickets available/unavailable restock detection<br>\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)<br>\n<br>\n - 0.42.2<br>\n - UI - Configurable pager size #1599 #1598<br>\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 )<br>\n - Restock detection - Better reporting when it fails (#1584)<br>\n - Fetcher - Puppeteer experimental fetcher wasn&#39;t returning the status-code (#1585)<br>\n - Update README.md<br>\n<br>\n - 0.42.1<br>\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)<br>\n<br>\n - 0.42<br>\n - UI - &#34;Search List&#34; also works for &#39;Title&#39; field<br>\n - UI - New &#34;Search List&#34; icon and functionality (#1580)<br>\n - VisualSelector - Add message when first version cannot be found<br>\n - UI - update link to official project page<br>\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)<br>\n - BrowserSteps - Support for float seconds (0.5 etc)<br>\n - BrowserSteps - Session keep alive timer countdown fix<br>\n - BrowserSteps - adding setup check<br>\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors<br>\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a &amp;lt;div&amp;gt; or other<br>\n - Fetcher - Experimental fetcher - dont cache embedded data URLs<br>\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)<br>\n - BrowserSteps - Include nice big start button SVG<br>\n - BrowserSteps - Remove unreliable method for detecting if the element has a &#34;click&#34; listener and default to click (switch to &#39;Click X,Y&#39; will return the right co-ords anyway)<br>\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)<br>\n - UI - Adding shortcut list select button for &#34;clear/reset history&#34;<br>\n - Fetcher - Experimental fetcher fixes, now only enabled with &#39;USE_EXPERIMENTAL_PUPPETEER_FETCH&#39; env var (default off) (#1561)<br>\n - UI - Adding shortcut list select button for &#34;clear/reset history&#34;<br>\n - Element scraper - wrap offset detection in try/catch<br>\n - BrowserSteps - BrowserSteps was not always following proxy information<br>\n - BrowserSteps - remove minor delay<br>\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)<br>\n - UI - Fix back navigation / browser history (#1556)<br>\n - UI - HTML validation improvements for edit forms (#1553)<br>\n - UI - Various minor HTML validation fixes<br>\n - UI - pagination - use count including tag filter for pagination display<br>\n - UI - Notifications - Adding icon to &#34;Add Email&#34; button<br>\n - UI - Adding pagination to watch list (#1549)<br>\n - UI - Set selected watches as &#39;viewed&#39; (#1550)<br>\n - UI - Fix missing &amp;lt;/span&amp;gt; in watch list when using restock detection<br>\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)<br>\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)<br>\n - Adding generic changedetection.io SVG icon #1527<br>\n - Tests - error test - be sure to clear results from other test parts<br>\n - Update README.md<br>\n - Tests - Add test to check that low level fetch errors are cleared on next check<br>\n - Restock alerts - adding extra detection texts<br>\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)<br>\n - Automated CI test for ensuring pypi package was built correctly (#1488)<br>\n<br>\n - GitHub container build - &#39;provenance&#39; was disabled<br>\n - 0.41.1<br>\n - Fix for pip installations<br>\n<br>\n - 0.41<br>\n - Notifications - Include triggered text token as&nbsp;&nbsp;`{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)<br>\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also<br>\n - Quick add form - adjust font size and rename stock recheck<br>\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)<br>\n - Restock / stock / out of stock monitor - bumping detection texts<br>\n - Use brotli for reducing the size of the text snapshots (#1482)<br>\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)<br>\n - New feature - Restock / stock / out of stock monitor option/mode<br>\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.<br>\n - Update README.md<br>\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)<br>\n - BrowserSteps - Adding `Goto URL` step<br>\n - Fixing bad linebreak definition `&amp;lt;/br&amp;gt;` in notifications and UI (#1465)<br>\n - Notification Improvements - New tokens `{{diff_added}}` and&nbsp;&nbsp;`{{diff_removed}}`, removed whitespace around `added` and `into`&nbsp;&nbsp;( Issue #905 ) (#1454)<br>\n - Update README.md<br>\n<br>\n - Bug - False change alerts - code cleanups Re #962 (#1444)<br>\n - Update README.md<br>\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)<br>\n - False change alerts fix - Don&#39;t reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)<br>\n - Library update - Replace bs4 with beautifulsoup4 (#1433)<br>\n - API - Including `last_changed` timestamp in watch API info (#1436)<br>\n - Update apprise to 1.3.0 (#1430)<br>\n - API documentation - improving example for list watches<br>\n - API documentation - improving example for snapshot history<br>\n - API - Adding current version to &#39;System Information&#39; endpoint, bumping API docs, Re #1429<br>\n - Further improving API documentation Re #1426<br>\n - Improving API documentation Re #1426<br>\n - Browser Steps - Adding &#34;Wait for text&#34; and &#34;Wait for text in element&#34; Re #1427<br>\n - Re #1382 - UI fix - sorting now works with selected tag<br>\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)<br>\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same&nbsp;&nbsp;(#1410)<br>\n - Deleting a watch now removes the entire watch storage directory (#1408)<br>\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)<br>\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393<br>\n - Remove unused code (#1394)<br>\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot<br>\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389<br>\n<br>\n - 0.40.2<br>\n - Code cleanup - remove unused import<br>\n - UI fix - Fix logic for showing screenshot on diff page (#1379)<br>\n - Re #1365 - Playwright - Browser &#34;Service Workers&#34; should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)<br>\n - New setting to allow passwordless access to your &#39;diff&#39; page - perfect for sharing your diff page securely, refactored login code (#1357)<br>\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)<br>\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)<br>\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)<br>\n - Fix fetch UI default fetch backend option icon (#1343)<br>\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)<br>\n<br>\n - 0.40.1.1<br>\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)<br>\n<br>\n - 0.40.1.0<br>\n - Update README.md<br>\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079<br>\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)<br>\n - Ability for watch to use a more obvious system default fetcher (#1320)<br>\n - Update README.md<br>\n - pip - eventlet doesnt support dnspython &amp;gt;=2.3.0 (Fixes build error)<br>\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)<br>\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)<br>\n - Data storage - Don&#39;t recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)<br>\n - UI: Updating queued success message (#1285)<br>\n - README.md - Fix release link (#1277)<br>\n - Notifications: updating apprise (slack notification fixes and others) (#1272)<br>\n - Remove docker-compose version so it works on any modern version #1144 (#1268)<br>\n - Update the docker compose file to any version (#1079) (#1144)<br>\n - IPv6 support for listening on (#1267)<br>\n - Test improvements (#1264)<br>\n<br>\n - 0.40.0.4<br>\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)<br>\n - Filters &amp;amp; Notifications - fixed tokens in filter not found notification<br>\n - UI - Fix broken html tags in settings page<br>\n - Proxy Settings in UI - TidyUp BrightData text<br>\n - Ability to configure extra proxies via the UI (#1235)<br>\n - Docker container updates - use Python 3.10, remove unused packages<br>\n - Tidy up list icons a bit (#1250)<br>\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)<br>\n - Testing - Run test as fully built docker container (#1245)<br>\n - Dark mode - system setting var is not required (its cookie based)<br>\n<br>\n - 0.40.0.3<br>\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements<br>\n - Fetching - Check the most overdue watch first (#1242)<br>\n - Overview list - Checkbox action &#34;Recheck&#34;<br>\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)<br>\n - Fetching - Always sort the key order of JSON content for less false alerts&nbsp;&nbsp;(May cause an alert on upgrade, but will be better going forwards) #1219<br>\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder<br>\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)<br>\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers<br>\n - Improve ARM/rust build comment<br>\n - README.md - Improving JSONPath example for LD+JSON product data<br>\n<br>\n - 0.40.0.2<br>\n - Price follower - Dont scan for ldjson data when &#39;no&#39; was clicked on the suggestion (#1207)<br>\n - Adding missing parts for pip build Re #1206<br>\n<br>\n - 0.40.0<br>\n - VisualSelector - Exclude items that are not interactable or visible<br>\n - Automatically offer to track LD+JSON product price data (#1204)<br>\n - UI - favicon callback no longer needed<br>\n - Test cleanups (#1196)<br>\n - Update runtime.txt (#1198)<br>\n - Dark mode - HTML template tidy up (#1197)<br>\n - UI - watch tags also known as watch tag / label<br>\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly<br>\n - Extract data - minor improvement to example<br>\n - Darkmode - Pause/Mute notification colour fix, re #1195<br>\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)<br>\n - Notifications - tokens/jinja2 templating (#1184)<br>\n - Dark mode - more colour fixes<br>\n - Test improvement - improving notification error network test<br>\n - Extract text as CSV - Extra validation (#1192)<br>\n - Dark mode - make watch list easier to read when theres &#39;unviewed&#39; entries<br>\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)<br>\n - UI - Cursor over labels should be pointer<br>\n - Dark mode - Make watches with errors easier to read<br>\n - Dark mode - cookie path should be all site<br>\n - Tweaks - adding hover/title to dark mode button<br>\n - UI - Dark Mode (#1187)<br>\n - docker-compose - Add playwright/selenium container dependencies example (#1178)<br>\n - BrowserSteps - Can be shared by the watch share link<br>\n - UI - Make tabs hoverable<br>\n - Favicon multiplatform and path fix/update (#1176)<br>\n - BrowserSteps - Cleanup interface on shutdown<br>\n - BrowserSteps - More work on cleaner shutdowns of browser session<br>\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown<br>\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)<br>\n - BrowserSteps - Use correct mimetype for screenshot update<br>\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)<br>\n - BrowserSteps - Add &#39;Execute JS&#39; step<br>\n - BrowserSteps - Also try to find clickable div/spans<br>\n - Update README.md<br>\n - Update README.md<br>\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset<br>\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169<br>\n - Extra validation for URLs with template markup (#1166)<br>\n - Browser Steps - adding &#39;please wait&#39; text while loading<br>\n - Re #1163 psutil missing from pip requirements<br>\n - Update README.md<br>\n - Update README.md<br>\n - VisualSelector &amp;amp; BrowserSteps - Scraper improvements, remove duplicate code<br>\n - Bumping VisualSelector example animation<br>\n - Remove dupe xpath finder prep code<br>\n - Browsersteps &#39;Beta&#39; label image path fix<br>\n - Configurable &#34;Browser Steps&#34; when Playwright/Chrome is configured&nbsp;&nbsp;(enter text, scroll, wait for text, click button etc) (#478)<br>\n - Update README.md -&nbsp;&nbsp;Make docker instructions easier to follow on Windows&nbsp;&nbsp;(#1158)<br>\n<br>\n - 0.39.22.1<br>\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)<br>\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly<br>\n - Update README.md<br>\n - Update README.md<br>\n<br>\n - 0.39.22<br>\n - Fix dangling HTML tag from screenshot notification<br>\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot,&nbsp;&nbsp;(#1140)<br>\n - Minor test improvements<br>\n - Option to attach screenshot to notification (#1127)<br>\n - VisualFilter - check previously set filters were set before highlighting<br>\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.)<br>\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)<br>\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)<br>\n - Make link to notification debug log easier to find (#1130)<br>\n - Bump notification library (#1128)<br>\n - Re #1126 HIDE_REFERER setting had wrong default<br>\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use &#39;False&#39; (#1121)<br>\n - Stability fix related to the new watch check count (#1113)<br>\n - Use deepcopy to stop possible data corruption (#1108)<br>\n - Code- Use dict .get instead of key<br>\n - Adding a check counter to watch fetching (#1099)<br>\n - Update README.md<br>\n - HIDE_REFERER incompatible with password based login, added comment to code #996<br>\n - Update README.md<br>\n - Filters can now accept a list/multiple filters (#1064) #623<br>\n<br>\n - 0.39.21.1<br>\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)<br>\n<br>\n - 0.39.21<br>\n - Disable version check when pytest is running (#1084)<br>\n - Removing unused code (#1070)<br>\n - Docker &amp;amp; python - Jq conditional pip requirements.txt include (Don&#39;t install in Windows because theres no Windows library/wheel)<br>\n - Docker &amp;amp; python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)<br>\n - UI - Make fetch error more readable (#1038)<br>\n - Update README.md<br>\n - Re #1052 - Watch &#39;open&#39; link should use any dynamic/template info (#1063)<br>\n - Remove accidental files<br>\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation<br>\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)<br>\n - API - system info - allow 5 minutes grace before watch is considered &#39;overdue&#39;<br>\n - API - Adding basic system info/system state API (#1051)<br>\n - Build - Fix syntax in container build test (#1050)<br>\n - Building - Test container build on PR<br>\n - Testing - Use same version of playwright while running tests as in production builds (#1047)<br>\n - update path for validation in the CONTRIBUTING.md (#1046)<br>\n - History index safety check - Be sure that only valid history index lines are read (#1042)<br>\n - Option to Hide the Referer header from monitored websites. (#996)<br>\n<br>\n - 0.39.20.4<br>\n - Better cross platform file handling in diff and preview (#1034)<br>\n<br>\n - 0.39.20.3<br>\n - Windows - diff file handling improvements (#1031)<br>\n - Also include tests in pip build<br>\n - Update README.md<br>\n<br>\n - 0.39.20.2<br>\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)<br>\n - Adding test - Test the &#39;execute JS before changedetection&#39; (#1006)<br>\n<br>\n - 0.39.20.1<br>\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)<br>\n - Adding `make` to Dockerfile build as required by jq for ARM devices<br>\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)<br>\n<br>\n - 0.39.20<br>\n - Adds support for jq JSON path querying engine (#1001)<br>\n - Adding link to BrightData Proxy info (#1003)<br>\n - Remove quotationspage default watch<br>\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)<br>\n - Selenium fetcher - screenshot should be taken after &#39;wait&#39; time, not before #873<br>\n - Upgrade Playwright to 1.26<br>\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958<br>\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing &#34;Unable to retrieve content because the page is navigating and changing the content.&#34; on some sites<br>\n - Tidy up proxies.json logic, adding tests (#955)<br>\n - Update README.md - Include BrightData suggestion<br>\n - Improve Proxy minimum time debug output<br>\n - Default proxy settings fixes<br>\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)<br>\n - Upgrade Playwright to 1.25<br>\n - Update README.md<br>\n<br>\n - 0.39.19.1<br>\n - Notification - code tidyup<br>\n - Watch list &amp;amp; notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default<br>\n - Notification - Reset defaults button should be on edit page only<br>\n - Notification watch settings - add button to make watch use defaults (empties the settings)<br>\n - Notification system update - set watch to use defaults if it is the same as the default<br>\n - Fix typo (#924)<br>\n<br>\n - 0.39.19<br>\n - Update README.md<br>\n - Tweaks to python PIP readme<br>\n - Use play and pause separate icons (#919)<br>\n - Further notification settings refinement (#910)<br>\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)<br>\n - repair pip readme<br>\n - Test improvement - Visual selector data loads as JSON (#895)<br>\n - Cleaner separation of watch/global notification settings (#894)<br>\n - Code maintenance - Removing old function (#875)<br>\n - Show screenshot age in [preview]<br>\n - Update README.md<br>\n - Update README.md<br>\n - Update README.md<br>\n - Update bug_report.md<br>\n - Update bug_report.md<br>\n - Update README.md<br>\n<br>\n - 0.39.18<br>\n - More data saving pre-checks (#863)<br>\n - Update screenshot<br>\n - Checkbox operations - reorder buttons for safety<br>\n - UI feature - Basic checkbox/group operations (#861)<br>\n - Bug fix - automatically queued watch checks weren&#39;t always being processed sequentially<br>\n - Playwright - Support proxy auth mechanisms (#859)<br>\n - Update README.md<br>\n - Update README.md<br>\n - Skip processing when watch was deleted<br>\n - Playwright fetcher didn&#39;t report low level HTTP errors correctly (like Connection Refused) (#852)<br>\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)<br>\n - Visual selector data not being saved by refactor<br>\n - &#39;Save chrome screenshot&#39; checkbox never used, removing, we always save the screenshot. (#844)<br>\n - Crash fix: Data store sub-directories werent always being created when needed (#842)<br>\n - Make the table header easier to understand when sorting (#840)<br>\n - Column sorting (#838)<br>\n - Update README.md<br>\n - Revert &#34;don&#39;t process paused entries after queue&#34;, so we can still manually recheck a paused watch<br>\n - Remove &#39;last-changed&#39; from url-watches.json and always calculate from history index (#835)<br>\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies<br>\n - Execute JS should happen after waiting seconds<br>\n - Upgrade playwright python driver (#834)<br>\n - Crash protection - handle the case where watch was deleted while being checked (#833)<br>\n - Don&#39;t process a watch if it was paused after being queued (#825)<br>\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)<br>\n - Remove social links for now<br>\n<br>\n - 0.39.17.2<br>\n - Test fix - Remove debug from test<br>\n - Security update -&nbsp;&nbsp;Password could be unset from settings form unexpectedly (#808)<br>\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes<br>\n - Handle SIGTERM for cleaner shutdowns (#737)<br>\n - Remove [save &amp;amp; preview] button, the preview is not updated live so it can lead to confusion (#801)<br>\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)<br>\n - [preview current] cleanup code and add test<br>\n - Feature - mute notifications (#791)<br>\n - Test improvement - remove unnecessary step<br>\n<br>\n - 0.39.17.1<br>\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)<br>\n - README.md - new Discord invite link<br>\n<br>\n - 0.39.17<br>\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit<br>\n - UI Feature - Add watch in &#34;paused&#34; state, saving then unpauses (#779)<br>\n - Enhancement - support xPath text() function filter, for example &#34;//title/text()&#34; in RSS feeds (#778)<br>\n - Bug fix - Filter &#34;Only trigger when new lines appear&#34; should check all history, not only the first item (#777)<br>\n - Visual Selector direct element finder fix<br>\n - Update README.md<br>\n - Update README.md links<br>\n - Filter failure notification send default enable now controlled by setting Env var<br>\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)<br>\n - Update README.md - adding LinkedIn link<br>\n - Update README.md - Adding Discord and YouTube links<br>\n - Bug fix for alerting when xPath based filters are no longer present (#772)<br>\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)<br>\n - mailto plaintext handling fix for &#39;plaintext&#39; apprise integration<br>\n - Minor code cleanups<br>\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)<br>\n - Form text tweak - Regex clarification (#766)<br>\n - Update README.md<br>\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)<br>\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL<br>\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)<br>\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)<br>\n - remove extra file<br>\n - removing package-lock.json - not required to be in git<br>\n - Share-icon cleanups<br>\n - Test improvement: Extract text should return all matches<br>\n - Bug fix: RSS Feed should also announce utf-8 charset<br>\n - Regex extract filter: Return all regex results instead of first match (#730)<br>\n - Ability to specify JS before running change-detection (#744)<br>\n - Playwright - log console errors to output<br>\n - UI Improvement - Clarifying &#34;Visual Filter&#34; tool as &#34;Visual Selector Filter&#34;<br>\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)<br>\n - Update docker-compose.yml&nbsp;&nbsp;- Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)<br>\n<br>\n - 0.39.16<br>\n - Fix notification apprise application name to changedetection.io #731<br>\n - Update README.md<br>\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)<br>\n - Playwright - Use HTTP Request Headers override (Cookie, etc)<br>\n - lang: prefer &#39;clear (snap) history&#39; to &#39;scrub&#39; (#721)<br>\n - Minor diff page improvements - list should be sorted &#39;newest first&#39; and no need to include the current version to compare against (#716)<br>\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705<br>\n - Update README.md<br>\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)<br>\n - New filter - Block change-detection if text matches - for example, block change-detection while the text &#34;out of stock&#34; is on the page, know when the text is no longer on the page (#698)<br>\n - Docker containers - :latest is now stable release, :dev is now master/nightly<br>\n - Trigger filters improvement- it&#39;s possible some changes weren&#39;t getting detected because the previous checksum only recorded when an event occurred (#697)<br>\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured<br>\n - Notifications regression bug in 0.39.15 - only sent the first notification URL<br>\n - Playwright screenshots - no need for high-res &#34;bug workaround&#34; screenshot, use lower quality/faster configurable image quality env var<br>\n - Adding extra check when updating DB on ReplyWithContentButNoText<br>\n - Notifications log - log what was sent after applying all cleanups<br>\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram<br>\n - Give more helpful error message when a page doesnt load<br>\n - Tweaks to playwright fetch code - better timeout handling<br>\n - Re #580 - New functionality - Random &#34;jitter&#34; delay to requests (#681)<br>\n<br>\n - 0.39.15<br>\n - Watch overview list - adding spinner to make it easier to see whats currently being &#39;Checked&#39;<br>\n - Preview section - add helpful check<br>\n - Send test notification - improved handling of errors<br>\n - Notification log - also log normal requests and make the log easier to find<br>\n - Update bug_report.md<br>\n - Use correct RSS CDATA handling (#662)<br>\n - Improve logging (#671)<br>\n - New [scrub] button when editing a watch - scrub single watch history (#672)<br>\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)<br>\n - Diff + Preview - Fixing screenshot behaviour after preference change<br>\n - Screenshot handling on the diff/preview section refactor (#630)<br>\n - Shared watches - include &#34;Extract text&#34; filter<br>\n - Improve error message when filter not found in page result (#666)<br>\n - &#34;Extract text&#34; filter - improve placeholder example<br>\n - Visual selector - &#39;clear selection&#39; button should clear the filter also<br>\n - New feature - &#34;Extract text&#34; filter ability (#624)<br>\n - Fixing RSS feed HTML content formatting (#662)<br>\n - Update notification library - Improving telegram support<br>\n - &#39;Mark all viewed&#39; button was missing in this version, added test also. (#652)<br>\n - Content fetcher - Handle when a page doesnt load properly<br>\n - Playwright - Correctly close browser context/sessions on exceptions<br>\n - Move history data to a textfile, improves memory handling (#638)<br>\n - Update feature_request.md<br>\n - Remove UK Covid news<br>\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)<br>\n - Remove group tag arbitrary length limit (#645)<br>\n - Distill.io import bug fix when no tags assigned to a watch (#557)<br>\n - Ignore whitespace on by default<br>\n - Visual Selector - clear events when changing tabs<br>\n - Minor code cleanup<br>\n - Re #616 - content trigger - adding extra test (#620)<br>\n - README.md update Visual Selector tool - tidy up screenshots, improve text<br>\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads<br>\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML<br>\n - Update bug_report.md<br>\n - 0.39.14.1<br>\n<br>\n - 0.39.14.1<br>\n - pip build fix - include API module<br>\n - Visual Selector - be more resilient when sites interfere with the xPath scraping<br>\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)<br>\n<br>\n - 0.39.14<br>\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)<br>\n - API Interface (#617)<br>\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )<br>\n - Fixing edit template HTML<br>\n - Proxy settings on watch should have a &#34;[ ] default&#34; option (#610)<br>\n - Input field tidyup (#611)<br>\n - Update wiki link for &#39;More info&#39; about sharing a watch and its configuration<br>\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)<br>\n - Playwright - raise EmptyReply on empty reply, no need to process further<br>\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)<br>\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)<br>\n - Update PIP readme.md<br>\n<br>\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)<br>\n<br>\n - 0.39.13<br>\n - Distill.io JSON export file importer (#592)<br>\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)<br>\n - Improving Playwright docs (#588)<br>\n - Playwright - code fix<br>\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO<br>\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)<br>\n - Playwright fetcher - use the correct default User-Agent<br>\n - Toggle visibility of extra requests options/settings when not in use (#584)<br>\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative)&nbsp;&nbsp;(#489)<br>\n - Simplify scrub operation (simply cleans all) (#575)<br>\n - Bugfix - dont update record when deleted during check<br>\n - Improving support info in README.md<br>\n - Handle deletions better (#570)<br>\n - Data storage bug fix #569<br>\n - Upgrade notifications library - fixing marketup in email subject<br>\n - Ability to &#39;Share&#39; a watch by a generated link, this will include all filters and triggers - see Wiki (#563)<br>\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title<br>\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds<br>\n - Seconds/minutes/hours/days between checks form field upgrade from &#39;minutes&#39; only (#512)<br>\n - Form styling improvements<br>\n - Form field handling improvements - fixing field list handler for empty lines<br>\n - Fix &#34;Add email&#34; button in main global notification settings<br>\n - Test notification button fixed in main settings (#556)<br>\n - tgram:// be sure total notification size is always under their 4096 size limit<br>\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)<br>\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes<br>\n - Discord:// notification size limit - also includes the notification title<br>\n - Fix spelling errors<br>\n - Update README.md<br>\n - Update README.md<br>\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)<br>\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable<br>\n - Refactor form handling (#548)<br>\n - Adding support for change detection of HTML source-code via &#34;source:https://website.com&#34; prefix (#540)<br>\n - Re-label the quick-add widget placeholder &#39;tag&#39; to &#39;watch group&#39;<br>\n - HTTP Fetcher code improvements<br>\n - Adding RSS metadata auto-discovery<br>\n - Upgrade WTforms form handler to v3 (#523)<br>\n<br>\n - 0.39.12<br>\n - Miscellaneous settings form visual improvements (#535)<br>\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes<br>\n - Specify our Discord avatar_url as default avatar_url<br>\n - Minor git updates<br>\n - Fix screenshot tab name<br>\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)<br>\n - Make long reports in the notification error log easier to read<br>\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)<br>\n - Update README.md<br>\n - Skip processing a watch into the RSS feed if there&#39;s not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)<br>\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)<br>\n - Make text tab always available at default<br>\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)<br>\n - Remove &#39;unviewed&#39; status in watch table when Diff link clicked (#514)<br>\n - RSS feed CDATA should contain difference output<br>\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output<br>\n - Update README.md<br>\n - Update README.md<br>\n - Minor UI cleanups (mobile tabs, font sizing) (#503)<br>\n - Fix typo in Filters &amp;amp; Triggers settings. (#495)<br>\n - Add autofocus attribute to password login field (#496)<br>\n<br>\n - 0.39.11<br>\n - Microsoft Windows installation fixes (#492)<br>\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)<br>\n - GitHub tweak - build containers also on push to master<br>\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)<br>\n - Security update - Use CSRF token protection for forms, make &#34;remove password&#34; use HTTP Post (#484)<br>\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)<br>\n - Only build container on GitHub releases, not tests<br>\n - Also change container names to help stop some DNS issues<br>\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)<br>\n - Improving form/edit example markup<br>\n - JSON diff/preview should use utf-8 encoding where possible (#465)<br>\n - Fix typo in settings form<br>\n - Add python venv to .gitignore<br>\n<br>\n - 0.39.10<br>\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)<br>\n - Minor updates to filters form text<br>\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)<br>\n - Testing - Refactor HTTP Request Type test (#453)<br>\n - Make table header font size the same as content<br>\n - Adjust background colours<br>\n - Handle the case where the visitor is already logged-in and tries to login again (#447)<br>\n - Make the Request Override settings easier to understand<br>\n - Minor tweak to notification token table<br>\n - Style tweak to watch form<br>\n - Login form style fixes<br>\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)<br>\n - Remove pytest from production release pip requirements<br>\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory<br>\n - Re-arranging primary links so the important ones are easier to find on mobile<br>\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)<br>\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)<br>\n - Better text/plain detection and refactor tests (#443)<br>\n - Tweak support tabs and text (#440)<br>\n - Include link to changedetection.io hosted option (#439)<br>\n -&nbsp;&nbsp;Improved CPU usage around the loop responsible for what sites needs to be checked<br>\n - Update README.md with hosting options<br>\n<br>\n - 0.39.9<br>\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)<br>\n - &#34;Recheck&#34; button should work when entry is in paused state<br>\n - Better file exception handling on saving index JSON<br>\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test<br>\n - Ensure string matching on the ignore filter is always case-INsensitive<br>\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page<br>\n - Update README.md<br>\n - XPath RegularExpression support<br>\n - better checking of JSON type<br>\n - Make system level errors from the HTTP fetchers easier to find (#421)<br>\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)<br>\n - Dont allow redirect on login, it&#39;s safer and more reliable this way (#414)<br>\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int<br>\n<br>\n - 0.39.8<br>\n - Number of fetching workers can be overriden by Env &#34;FETCH_WORKERS&#34; (#413)<br>\n - Adding Env var &#34;WEBDRIVER_DELAY_BEFORE_CONTENT_READY&#34; to wait n seconds before extracting the text from the browser<br>\n - Language fix &#34;watches are rechecking.&#34; it actually puts them into an internal queue &#34;watches are QUEUED for rechecking&#34;<br>\n - Use flask url_for() for webdriver chrome icon instead of relative path<br>\n - Fix typo in the startup create-directory command suggestion (#405)<br>\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)<br>\n - Refactor tests for notification error log handler (#404)<br>\n - Notification error log handler (#403)<br>\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.<br>\n - fixed the reference to wiki for rpi section (#402)<br>\n - /preview format doesnt need &amp;lt;pre&amp;gt; - fixing too many returnlines in content on diff/preview page<br>\n - Update README.md<br>\n - Update README - Fix docker section<br>\n - Update README - Tidy up sections<br>\n - Offer instance on Lemonade Tidy README<br>\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)<br>\n - #323 Adding note about discord:// 2000 char limit (#392)<br>\n - plaintext mime type fix - Don&#39;t attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)<br>\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch<br>\n - Add option for tags on import (#377)<br>\n - Update CONTRIBUTING.md<br>\n - Update README.md<br>\n - Fix bug where diff and diff_full were switched in notification templates. (#380)<br>\n - Closes #378<br>\n<br>\n - 0.39.7<br>\n - Scrub watch snapshot fixes<br>\n - Simple HTTP auth (#372)<br>\n - Adding note about JS pages<br>\n - Notification settings defaults and validation (#361)<br>\n - Filters settings helper text tidy-up<br>\n - Add test for low-level network error text handling<br>\n - Add API endpoint for current snapshot (#359)<br>\n - Clarify notice/messages around changing ignore text<br>\n<br>\n - 0.39.6<br>\n - Heroku tweaks (backup download) (#356)<br>\n - XPath support (#355)<br>\n - Better handling of EmptyReply exception, always bump &#39;last_checked&#39; in the case of an error (#354)<br>\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)<br>\n - fix typo in README.md (#350)<br>\n - Re #348 - Add test for backup, use proper datastore path<br>\n - Update README.md<br>\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)<br>\n - Re #340 - snapshot should not be modified by ignore text (#344)<br>\n - Re #133 Option for ignoring whitespacing (#345)<br>\n - Re #342 notification encoding (#343)<br>\n - Update README.md<br>\n - Adding global ignore text (#339)<br>\n - Adding new proxyType to selenium mappings<br>\n - Use selenium 4.1.0<br>\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594<br>\n - Add socksVersion mapping (#331)<br>\n - Fix broken RSS link fields<br>\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you&#39;re watching, and RSS Title is the page you&#39;re watching<br>\n - Unify Filters and Triggers tabs into a single tab<br>\n - Move &#39;request type&#39; field to the new &#39;Requests&#39; tab<br>\n - Aligning call signatures #325<br>\n - Extend Request Parameters to add Body &amp;amp; Method (#325)<br>\n - Update README.md<br>\n - Create CONTRIBUTING.md<br>\n - Update README.md<br>\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)<br>\n - Update README.md<br>\n - Update README.md<br>\n - Update README.md<br>\n<br>\n - 0.39.5<br>\n - Update feature_request.md<br>\n - Update issue templates<br>\n - Update bug_report.md<br>\n - Update issue templates<br>\n - W3C HTML validation issue around RSS icon<br>\n - Closes #323 adds link to wiki<br>\n - Update README.md<br>\n - Update README.md<br>\n - improve theming docs<br>\n - Update README.md<br>\n - Update README.md<br>\n - Closes #315 - Include library apprise Notify_mqtt<br>\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)<br>\n - Go back to docker hub<br>\n - RSS allow access via token (#310)<br>\n - Adding deploy to Heroku button<br>\n - Adding heroku app.json app<br>\n - Tweak runtime Heroku version<br>\n - Tweaking heroku Procfile<br>\n - Adjust buildpacks on Heroku<br>\n - Adding heroku python3 runtime config<br>\n - Try simpler heroku recipe<br>\n - -C option to create a datadir if it doesnt exist<br>\n - Re #308 - Adding test and including settings in clone operation (#309)<br>\n - fixing too small font in diff UI (#260)<br>\n - Update README.md<br>\n - Send diff in notifications (#296)<br>\n - Fix scrub form theme<br>\n - Scrub dates: Fix date regex limit handler parsing<br>\n - Wait 60 seconds or until stop_thread is set<br>\n - Check that a notification URL is set when sending the test notification (#300)<br>\n - Flask 2 (#299)<br>\n - Re #269 - Show current/correct BASE_URL information (#271)<br>\n - Re #269 - Fix env var comment name<br>\n - Enable Markdown and HTML notifications. (#288)<br>\n<br>\n - 0.39.4 release<br>\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)<br>\n - Fix element paths when using reverse proxy subfolder (#272)<br>\n<br>\n - 0.39.3 release<br>\n - Re #264 - fixing clone watch operation<br>\n - Re #265 - extended jsonpath support (#266)<br>\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly<br>\n - Re #257 - Handle bool val of json path better (#263)<br>\n - Re #249 - Add EXPOSE 5000 to Dockerfile<br>\n - Provide better combination of chardet and urllib3<br>\n - Prefer GHCR.io over DockerHub (#245)<br>\n - Limit branches/tags of container build<br>\n - Re #213 - Adding screensize examples to selenium container<br>\n - Be more specific about tagged release builds<br>\n - Fix :latest release worflow syntax check<br>\n - Form helper - explain where the webdriver setting comes from<br>\n - Rename workflow name<br>\n - Just &#39;published&#39; and &#39;edited&#39; package release is enough (remove &#39;created&#39;)<br>\n<br>\n - Fixing workflow tag syntax issues<br>\n - fix broken workflow syntax<br>\n - add step for metadata debug, see if it runs by checking workflow tag name<br>\n - Container build/push doesnt need to be so specific<br>\n - Oops on/release was in the wrong block<br>\n - release also on edited, published<br>\n - Run workflow on release<br>\n - Use a better switch mechanism for build type<br>\n - version 0.39.2<br>\n - Configurable BASE_URL (#228)<br>\n - Split python pip builder to its own release based workflow<br>\n - remove accidental syntax add<br>\n - Re #242 - app was treating notification field defaults as the field value (#244)<br>\n - attempt to re-enable docker layer cache<br>\n - Forgot GHCR tag with version<br>\n - Limit container build to releases and master<br>\n - Fix GHCR login<br>\n - Use the same workflow for tag and release<br>\n - Drop redundant build workflow<br>\n - try :latest and :tag in same workflow run<br>\n - Separate workflows<br>\n - Docker image build issues (#243)<br>\n - Re #239 - Individual GUID for watch+changeevent (#241)<br>\n - Update README.md<br>\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)<br>\n - Setting for Extract &amp;lt;title&amp;gt; as title option on individual watches (#229)<br>\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7<br>\n - GitHub container repo (#227)<br>\n - Remove extra build step<br>\n - push github container master also<br>\n - Tidy up workflow names<br>\n - Attempt to setup GitHub Container Registry<br>\n<br>\n - v0.39.1<br>\n - Re #185 - [feature] Custom notifications templates per watch (#226)<br>\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)<br>\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title<br>\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title<br>\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)<br>\n - Adds &#39;Create Copy&#39; feature to clone a watch (#184)<br>\n - adding specific test (#205)<br>\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)<br>\n - Re #203 - validate tokens (#204)<br>\n - No point hiding the notifications customisation area because it&#39;s now in its own tab<br>\n - Update README.md<br>\n - Test - prove that notifications are not being sent when content does not change<br>\n - remove quotes from env vars<br>\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts<br>\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label<br>\n - Update README.md<br>\n<br>\n - Installation via pip (#186)<br>\n - Update README.md<br>\n - Trigger text/wait (#187)<br>\n - Reword group tag - more obvious name<br>\n - Fix img alt/title accesibility for pause icon<br>\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway<br>\n - Example placeholder was pushed out<br>\n - Move fetcher tab back to general - save space on mobile<br>\n - WebDriver test fetch should use environment var too<br>\n - Add fetch option to each watch<br>\n - Chrome/Webdriver support for Javascript websites (#114)<br>\n - Fixing tar npm security issue npm install&nbsp;&nbsp;&#34;tar@&amp;gt;=6.1.2&#34;<br>\n<br>\n - tag 0.38.2<br>\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break &#34;Cookie&#34; header (#175)<br>\n - Update heroku.yml<br>\n - Re #156 - PORT should always be an Integer<br>\n - Re #159 - Adding env var example to docker-config.yml<br>\n - Add Heroku Deployment Support (#159)<br>\n - Re #154 - Handle missing JSON better<br>\n - high res<br>\n - higher res screenshot<br>\n - Update screenshot<br>\n - Assert that html_tools.JSONNotFound is correctly raised<br>\n - Re #154 Ldjson extract parse (#158)<br>\n - Responsive fix for input field on mobile<br>\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.<br>\n - Add medium-size-desktop class to notification custom title<br>\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services<br>\n - Re #150 - stop using &#39;size&#39; across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)<br>\n - fix: setting overflow in mobile view (#150)<br>\n - Re #121, #123 - Show the current base_url value<br>\n - Re #149 - allow empty timestamp limit for scrub operation<br>\n - Dont show &#34;new version available&#34; message when password is enabled and user is logged out<br>\n - test fix - dont trigger notifications in header test<br>\n - Strengthen the notification tests<br>\n - Re #137 - Adding test to confirm that headers are not repeated<br>\n - Add debug output to notify loop<br>\n - Add note to field<br>\n - Cleanup test helper data before and after running<br>\n - Improve debug info<br>\n<br>\n - 0.38.1 tag<br>\n - Re #143 - Remove old notification test code, fix form handler (#145)<br>\n - Update README.md<br>\n - Re #135 - refactor the quick add widget (#136)<br>\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)<br>\n<br>\n - use a github action for getting the tag<br>\n - rename tag build runner<br>\n - fix tag<br>\n - build and push tag<br>\n - Re #76 - Fixing links<br>\n - Cleaner is to let flexbox overflow and scroll on the X where needed<br>\n - #76 app path prefix when behind proxy_pass (#91)<br>\n - Settings: Remove password link fix<br>\n - Make sure right menu is still visible when URL is long<br>\n - 0.38 release<br>\n - Re #132 - Make a list of the JSONpath results instead of using only the first value<br>\n - Customisable notifications (#123)<br>\n - Re #117 - dont re-encode single value types, looks better in the diff<br>\n - Usability tweak - [edit] on diff page should go back to diff page<br>\n - Update README.md<br>\n - Adding text about JSON API Monitoring<br>\n - Re #117 Jsonpath based JSON change detection filter (#125)<br>\n - Update README.md<br>\n - Update README.md<br>\n - Use right sticky for version<br>\n - Re #118 - Make &#39;show current version&#39; more obvious<br>\n - Diff page - use the document title in &amp;lt;title&amp;gt; for better bookmarking<br>\n - node-sass 6.0.1 works with node-sass watch way better<br>\n - Updating inscriptis/text/html library to 1.2<br>\n - Update readme with the branch link for javascript support<br>\n - Updating trim-newlines packages<br>\n<br>\n - 0.37 release<br>\n - #110 global recheck time (#113)<br>\n - Re #106 - handling empty title with gettr cleanup (#107)<br>\n - Update README.md<br>\n - Auto extract html title as title (#102)<br>\n - Bug fix - Check &#39;minutes_between_check&#39; is set<br>\n - tweak &amp;lt;pre&amp;gt; text wrapping when displaying diff<br>\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<br>\n - CSS Filter - restore nicer linefeeds<br>\n - @todo Comment - BS4&#39;s element.get_text() seems to lose the indentation format no-matter what<br>\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines<br>\n - Include statistics for number of watches<br>\n - Set edit-form for settings+watch to always be wide<br>\n<br>\n - Update README.md<br>\n - 0.36<br>\n - Re #42 - dont use blank titles<br>\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage<br>\n<br>\n - 0.35<br>\n - Time between rechecks is always stored as minutes<br>\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance<br>\n - Adding tests for password control handling<br>\n - Remove unused field (removepassword is actually a link)<br>\n<br>\n - 0.34<br>\n - Be sure not to use blank passwords as the password<br>\n - Re #42 - custom title (#98)<br>\n - Re #92 - Re-use existing [preview] function for viewing current (#97)<br>\n<br>\n - 0.33<br>\n - #81 - Regex support (#90)<br>\n - Use wtforms handler (#96)<br>\n - Re #95 - Include PUID/PGID example<br>\n - re-enable tests<br>\n - On settings submit, display saved message<br>\n - Use flasks&#39; built in &#39;flash&#39; method instead of a custom message/notices (#94)<br>\n - Adding rPi support info<br>\n - Re #92 Adding link to CSS selector help in wiki<br>\n - Re #93 - tweak build packages<br>\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc<br>\n - Strip surrounding whitespace from elements (#89)<br>\n - Queue an entry for immediate recheck after [edit]<br>\n - Adding helper method to remove text files that are not in the index<br>\n - Fix typo<br>\n - Re #88 - placeholder text on CSS rule<br>\n - Re #86 - fix typo<br>\n<br>\n - 0.32 release<br>\n - Sassify the diff page<br>\n - &#34;Sassify&#34; the theme, easier to manage<br>\n - Mobile fixes (#87)<br>\n - Re #86 - Refactor scrub date limit code<br>\n - Tweak comments<br>\n - Re #77 - Repair and refactor time threshold check code<br>\n - Modifies Dockerfile to use multistage builds (#79)<br>\n - Bumping to 0.31<br>\n<br>\n - Re #75 - Adding test to confirm watched URL appears in RSS feed<br>\n - CSS selector filter (#73)<br>\n - Fixing var name<br>\n - Include release metadata during github build<br>\n - Update README.md<br>\n - Re #40 Ability to set individual timers (#72)<br>\n - Update README.md<br>\n - Improvements for backup (#70)<br>\n - Update README.md<br>\n - Disable image layer cache service<br>\n - Re-enable ARM v6/v7 builds<br>\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size<br>\n - Remove rust build comments<br>\n - Arm build fixes (#68)<br>\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)<br>\n - Update README.md<br>\n - Adding BTC support instructions<br>\n - Switch to just amd64 for now due to apprise not building on ARM<br>\n - Fixing syntax<br>\n - Re #49 Re #60 - Adding more information about proxy setup to README.md<br>\n - Add socks proxy support (#60)<br>\n - Created docker-compose file (#55)<br>\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in &#39;seconds&#39; instead of minutes)<br>\n - 56 - Fix notification test<br>\n - Update README.md<br>\n - Update README.md<br>\n - Adding rust compiler :(<br>\n - trying without libssl and only libffi<br>\n - Adding extra libs required for build<br>\n - Cleanup docs<br>\n - Tweak workflow (tests)<br>\n<br>\n - Security update<br>\n - Apprise notifications (#43)<br>\n - Fixing security update<br>\n - Also detect pytest in the environ (for local debug)<br>\n - Prepend &#39;test-&#39; when runnning under pytest to guid<br>\n - - Relabel login button - misc test cleanup<br>\n - Re #46 - Add note to README.md about Javascript support<br>\n - Bumping version<br>\n - Re #45 - Set datastore path in app.config<br>\n - Re #44 - Broke the menu by accident, adding tests and fixing.<br>\n - bump to 0.29<br>\n<br>\n - docker-compose for dev not needed (use venv etc)<br>\n - Password protection / login support (#34)<br>\n - Update FUNDING.yml<br>\n - Skip using tag limit on pause when no tag is being viewed<br>\n - Pause/Unpause should respect limit tag on redirect<br>\n - Validate duplicate URLs<br>\n - Chdir is not needed because we add the file from the full path, but make it &#39;relative&#39; in the Zip<br>\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)<br>\n - Adding noopener per CodeQL, stop pages from knowing the referer etc<br>\n - Create codeql-analysis.yml<br>\n - yarl not needed, lock requests version<br>\n - dev packages needed, drop apt cache<br>\n - See if we get a clean buildx without dev packages<br>\n - Tweaking build size thanks to https://github.com/hadolint/hadolint<br>\n - Adding dockerignore<br>\n - Re #18 - Show &#34;preview&#34; of the page when only one revision exists (#33)<br>\n - Update README.md<br>\n - Update README.md<br>\n - Also check that the watch is not paused before putting it into the checking queuex<br>\n - revert c60be562718d23972d7d43821bb6b87f2add3256<br>\n - remove extra packages (#32)<br>\n<br>\n - Bumping version to 0.28<br>\n - Docker push amd64 rpi etc (#28)<br>\n - Open [diff] links into their own window<br>\n - Fix auto jump on viewing the diff<br>\n - Re #30 - Delete history watch snapshots (#31)<br>\n - Slow down the DB write interval and catch the case that it changed during write<br>\n - Immediately &#39;jump&#39; to the change<br>\n - Tweak to hover pause icon<br>\n - Stop runtime error on dict changing during write/init at start (#27)<br>\n - Re #22 - ability to pause<br>\n - Re #23 - always check value of interval time, not just on start<br>\n - Update README.md<br>\n - Use absolute image links so the screenshots work from docker hub<br>\n - Update README.md<br>\n - Updating screenshot<br>\n - Reuse the GUID if we have one<br>\n<br>\n - Dont show &#39;empty&#39; tag, it will be in the [ALL] list<br>\n - Adding RSS feed icon<br>\n - Generic object sync should use private method<br>\n - Add missing urllib3<br>\n - Add missing pytz<br>\n - Check for new version<br>\n - Fix import form flow logic<br>\n - Code tidy/lint<br>\n - Tidy up thread logic and version check<br>\n - Add missing dep<br>\n - Remove todos<br>\n - Add icon for RSS, RSS should show only unviewed entries<br>\n - Issue #7 - RSS feeds<br>\n - Always override tag version (load from disk in future, so we can add it at build time)<br>\n - next dev is 0.27<br>\n - Tweak to tests<br>\n - Move logic<br>\n - Remove erroneous extra liveserver setup<br>\n - When new ignore text is specified, reprocess the checksum<br>\n - Adding filter and log output to pytest<br>\n - Fix edit action link<br>\n - Minor lint cleanup<br>\n - Clean up after test case<br>\n - Remove liveserver, doesnt belong here<br>\n - Fix syntax, Triggers the workflow on push or pull request events<br>\n - Activate workflow on all branches<br>\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text<br>\n - Validation of added headers, should contain key/val (2 parts)<br>\n - Issue #12 include version for easy reference.<br>\n - Bring dev environment inline<br>\n - Tidying up requirements.txt<br>\n<br>\n - Handle the case of someone supplying a bad link<br>\n - Adding jump to next change diff widget<br>\n - Moving nice screenshot to above the fold :)<br>\n - Adding docker hub badge for tag information<br>\n<br>\n - Bumping schema tag to 0.25<br>\n - Issue #5 - Remove arbitrary &#39;600&#39; minutes limit<br>\n - Add test delay for github action test<br>\n - Add wait for threads in test<br>\n - Extending tests to cover resetting the diff/unviewed status correctly<br>\n - Tidy up return logic<br>\n - Code tidy<br>\n - Fix docker app files paths<br>\n - Tweaking Dockerfile for new eventlet wrapper<br>\n - Create LICENSE<br>\n - Adding docker pulls counter badge<br>\n - Use master branch for badge<br>\n - Removing unused import<br>\n - Fixing a few more easy lint wins<br>\n - Linting fixups<br>\n - Update README.md<br>\n - Add badge under pytest branch<br>\n - Create python-app.yml<br>\n - Create the test datastore<br>\n - Minor cleanup<br>\n - Just use the current/previous md5<br>\n - Finalse pytest methods<br>\n - Port should be an integer<br>\n - Tweaking client<br>\n - remove unused imports<br>\n - Use session/client fixture<br>\n - Addingmissing files<br>\n - hack of pytest implementation - doesnt work yet<br>\n - Tidy up a few broken datastore paths<br>\n - WIP, separate out the Flask from everything else, get pytest working<br>\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold<br>\n<br>\n - Adding 0.24 tag<br>\n - Avoid accidently using Python&#39;s objects that are copied - but land as a &#39;soft reference&#39;, need to use a better dict struct in the future #6<br>\n - Minor fix to &#39;last changed&#39; field, simplify template and logic<br>\n - Remove debug print<br>\n<br>\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch<br>\n<br>\n - Adding tag to json<br>\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old<br>\n - Minor fix - load extra stylesheet only once<br>\n - Minor tweaks for development setup<br>\n - Provide named containers and remove all existing<br>\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)<br>\n - Flag for immediate sync of index after adding new watch<br>\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member<br>\n - Adding ARG to Dockerfile<br>\n - Include the triggered build SHA as part of the backup info, when built in docker hub.<br>\n - Add cache busting var to style sheets<br>\n - Slightly more bulletproof instructions<br>\n - Updating screenshot<br>\n - Push newly created watches directly into the update check Queue.<br>\n - Adding checkall<br>\n - Easily download a full backup<br>\n - Show the date/time of the current/most up to date version<br>\n - Use a pool of thread workers, better for huge lists of watchers<br>\n - Code cleanup edit submit handler can be the same function<br>\n - Add update howto<br>\n - Refactor slightly confusing difference build function<br>\n - Version comparison had the wrong order<br>\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<br>\n<br>\n - Include the current URL in the page when viewing the version diff<br>\n - Include a selfcheck/diagnosis routine<br>\n - On manual recheck request, redirect to same tag listing<br>\n - Set default diff type to &#39;lines&#39;, faster for starters.<br>\n - Supply different versions to browse<br>\n - Fix heading<br>\n - Update README.md<br>\n - Adding diff screenshot<br>\n - Add more start-up examples<br>\n - Tweak theming<br>\n - Use a even simpler run command<br>\n - improve the wording<br>\n - Add basic settings page (so far just recheck time in minutes)<br>\n - Updating README<br>\n - Updating screenshot (new diff button)<br>\n - Trigger write index after edit of a watch<br>\n - Add [diff] mechanism<br>\n - Use a single thread for writing the sync json<br>\n - Use existing tag<br>\n - When all items showed, show which tag it belongs to<br>\n - Sort tag list<br>\n - Set active tag selection<br>\n - Support for comma separated tags<br>\n - Tweak styling for &#39;new watch&#39; form<br>\n - Remove import for old lib<br>\n - Switch to inscriptis prepare config backend struct<br>\n - Support for custom headers per watch<br>\n - Going back to larger PNG screenshot, looks better in Github :)<br>\n - Fix alt text in markup<br>\n - Adding new screenshot binary<br>\n - Updating screenshot<br>\n - Moving start text to a more visible part<br>\n - Tweak messages<br>\n - Change message text<br>\n - Fixing messages styling<br>\n - Basic tag browse buttons<br>\n - Bulk import<br>\n - Tidy up &#39;last_checked&#39; date handling<br>\n - Dev environment setup<br>\n - Dev docker tweaks<br>\n - Remove messy text<br>\n - Tweaking text<br>\n - Fixing checkall hook<br>\n - Use requests&#39;s r.text so we dont have to deal with charsets<br>\n - Add note<br>\n - Fix bad copy command<br>\n - Oops left out the image name<br>\n<br>\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io<br>\n - Update screenshot<br>\n<br>\n - Add more start-up examples<br>\n - Tweak theming<br>\n - Use a even simpler run command<br>\n - improve the wording<br>\n - Add basic settings page (so far just recheck time in minutes)<br>\n - Updating README<br>\n - Updating screenshot (new diff button)<br>\n - Trigger write index after edit of a watch<br>\n - Add [diff] mechanism<br>\n - Use a single thread for writing the sync json<br>\n - Use existing tag<br>\n - When all items showed, show which tag it belongs to<br>\n - Sort tag list<br>\n - Set active tag selection<br>\n - Support for comma separated tags<br>\n - Tweak styling for &#39;new watch&#39; form<br>\n - Remove import for old lib<br>\n - Switch to inscriptis prepare config backend struct<br>\n - Support for custom headers per watch<br>\n - Going back to larger PNG screenshot, looks better in Github :)<br>\n - Fix alt text in markup<br>\n - Adding new screenshot binary<br>\n - Updating screenshot<br>\n - Moving start text to a more visible part<br>\n - Tweak messages<br>\n - Change message text<br>\n - Fixing messages styling<br>\n - Basic tag browse buttons<br>\n - Bulk import<br>\n - Tidy up &#39;last_checked&#39; date handling<br>\n - Dev environment setup<br>\n - Dev docker tweaks<br>\n - Remove messy text<br>\n - Tweaking text<br>\n - Fixing checkall hook<br>\n - Use requests&#39;s r.text so we dont have to deal with charsets<br>\n - Add note<br>\n - Fix bad copy command<br>\n - Oops left out the image name<br>\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io<br>\n - Update screenshot<br>\n<br>\n - Add more start-up examples<br>\n - Tweak theming<br>\n - Use a even simpler run command<br>\n - improve the wording<br>\n - Add basic settings page (so far just recheck time in minutes)<br>\n - Updating README<br>\n - Updating screenshot (new diff button)<br>\n - Trigger write index after edit of a watch<br>\n - Add [diff] mechanism<br>\n - Use a single thread for writing the sync json<br>\n - Use existing tag<br>\n - When all items showed, show which tag it belongs to<br>\n - Sort tag list<br>\n - Set active tag selection<br>\n - Support for comma separated tags<br>\n - Tweak styling for &#39;new watch&#39; form<br>\n - Remove import for old lib<br>\n - Switch to inscriptis prepare config backend struct<br>\n - Support for custom headers per watch<br>\n - Going back to larger PNG screenshot, looks better in Github :)<br>\n - Fix alt text in markup<br>\n - Adding new screenshot binary<br>\n - Updating screenshot<br>\n - Moving start text to a more visible part<br>\n - Tweak messages<br>\n - Change message text<br>\n - Fixing messages styling<br>\n - Basic tag browse buttons<br>\n - Bulk import<br>\n - Tidy up &#39;last_checked&#39; date handling<br>\n - Dev environment setup<br>\n - Dev docker tweaks<br>\n - Remove messy text<br>\n - Tweaking text<br>\n - Fixing checkall hook<br>\n - Use requests&#39;s r.text so we dont have to deal with charsets<br>\n - Add note<br>\n - Fix bad copy command<br>\n - Oops left out the image name<br>\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io<br>\n - Update screenshot<br>\n - Add edit UI Move to keyed structure instead of list<br>\n - Fixes to CSS<br>\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads<br>\n - Tweaks to docker layout<br>\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc<br>\n - Create FUNDING.yml<br>\n<br>\n - Specify image name in docker files to avoid a confusing build/run<br>\n - Tidy up devel docker<br>\n - Tweak comments<br>\n - Avoid recasting the type<br>\n - Store a history of changes, used for future lookup/diff/explore changes UI<br>\n - Update README.md<br>\n - Show the backend error in the table if there is one<br>\n - Include screenshot<br>\n - Fix branch name<br>\n - Tweak todo<br>\n - Adding README amd docker info<br>\n - Add missing file<br>\n - Primitive support for extra headers<br>\n - remove debug<br>\n - Handle titles and links<br>\n - Fix base definition of the watcher<br>\n - sort by last changed<br>\n - fix button size<br>\n - Store the html2text version too<br>\n - fix favicon<br>\n - small fixes<br>\n - Handle errors better, use the plaintext output<br>\n - Workon threads<br>\n - WIP<br>\n - Remove nocache experimental<br>\n - Initial commit<br>\n<br>\n&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;", "url": "smtp2go://info@bvs-kassen.de/api-FD02EAF14E8B46C9993479DCBA517C79/info@bvs-kassen.de/?from=\"Changedetection%20Dashboard\"&avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png&format=html", "original_context": {"base_url": "https://change.bvs-kassen.de/", "change_datetime": "2026-04-27 17:46:19 CEST", "current_snapshot": "<html><head><meta name=\"color-scheme\" content=\"light dark\"></head><body><pre style=\"word-wrap: break-word; white-space: pre-wrap;\"> _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-04-28 00:37:14 +1000:\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 &lt;5,&gt;=4.9.0 to &gt;=4.13.1,&lt;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 &amp;nbsp; 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 `&lt;head&gt;` 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 &amp; 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 &amp; 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&amp;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 &amp; 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 &lt;title&gt; 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 &lt;-&gt;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` -&gt; `&lt;br&gt;` 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 &lt;select&gt; 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 &lt;title&gt; 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 &lt;title&gt;, `{{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 &amp; 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 - &lt;Select&gt; by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &lt;button&gt; (#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 &amp; 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\u00c3\u00a9t\u00c3\u00a9 Fran\u00c3\u00a7aise du Radiot\u00c3\u00a9l\u00c3\u00a9phone (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 &gt; 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 &amp; 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 &lt;title&gt; as title should work on all processors (#2490)\n - Restock &amp; 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 -&gt; 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 &amp; 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/&lt;uuid&gt;/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 &lt;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 &lt;title&gt; 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 - &lt;input&gt; 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 -&gt; tags -&gt; 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 &lt;div&gt; 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 &lt;/span&gt; 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 `&lt;/br&gt;` 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 &gt;=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 &amp; 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 &amp; 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 &amp; python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker &amp; 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 &amp; 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 &amp; 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 &amp; 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 &lt;pre&gt; - 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 &amp; 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 &lt;title&gt; 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@&gt;=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 &lt;title&gt; 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 &lt;pre&gt; 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</pre></body></html>", "diff": "", "diff_clean": "", "diff_added": "@changed_PLACEMARKER_OPENHEAD / 2026-04-27 17:11:06 +1000:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-04-28 00:37:14 +1000:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)@changed_into_PLACEMARKER_CLOSED", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://change.bvs-kassen.de/diff/c47245b6-2403-41f5-8635-e3d47f5e2c80", "markup_text_links_to_html_links": false, "notification_timestamp": 1777304803.4765377, "prev_snapshot": "<html><head><meta name=\"color-scheme\" content=\"light dark\"></head><body><pre style=\"word-wrap: break-word; white-space: pre-wrap;\"> _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-04-27 17:11:06 +1000:\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 &lt;5,&gt;=4.9.0 to &gt;=4.13.1,&lt;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 &amp;nbsp; 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 `&lt;head&gt;` 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 &amp; 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 &amp; 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&amp;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 &amp; 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 &lt;title&gt; 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 &lt;-&gt;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` -&gt; `&lt;br&gt;` 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 &lt;select&gt; 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 &lt;title&gt; 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 &lt;title&gt;, `{{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 &amp; 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 - &lt;Select&gt; by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &lt;button&gt; (#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 &amp; 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\u00c3\u00a9t\u00c3\u00a9 Fran\u00c3\u00a7aise du Radiot\u00c3\u00a9l\u00c3\u00a9phone (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 &gt; 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 &amp; 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 &lt;title&gt; as title should work on all processors (#2490)\n - Restock &amp; 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 -&gt; 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 &amp; 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/&lt;uuid&gt;/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 &lt;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 &lt;title&gt; 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 - &lt;input&gt; 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 -&gt; tags -&gt; 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 &lt;div&gt; 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 &lt;/span&gt; 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 `&lt;/br&gt;` 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 &gt;=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 &amp; 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 &amp; 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 &amp; python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker &amp; 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 &amp; 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 &amp; 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 &amp; 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 &lt;pre&gt; - 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 &amp; 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 &lt;title&gt; 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@&gt;=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 &lt;title&gt; 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 &lt;pre&gt; 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</pre></body></html>", "preview_url": "https://change.bvs-kassen.de/preview/c47245b6-2403-41f5-8635-e3d47f5e2c80", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "c47245b6-2403-41f5-8635-e3d47f5e2c80", "watch_mime_type": "text/plain", "watch_tag": "Software", "watch_title": "Changedetection.io", "watch_url": "https://changedetection.io/CHANGELOG.txt", "watch_uuid": "c47245b6-2403-41f5-8635-e3d47f5e2c80", "notification_urls": ["smtp2go://info@bvs-kassen.de/api-FD02EAF14E8B46C9993479DCBA517C79/info@bvs-kassen.de/?from=\"Changedetection%20Dashboard\""], "notification_title": "{{watch_title}} \u00c4nderungsmitteilung", "notification_body": "Auf {{watch_url}} hat sich etwas ge\u00e4ndert:\r\n---\r\n{{diff_url}}\r\n---\r\n{{diff_added}}\r\n---\r\n{{current_snapshot}}", "notification_format": "htmlcolor", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://change.bvs-kassen.de/edit/c47245b6-2403-41f5-8635-e3d47f5e2c80", "raw_diff": ""}}]