Try our Chrome extension
Easily add the current web-page from your browser directly into your changedetection.io tool, more great features coming soon!Changedetection.io needs your support!
You can help us by supporting changedetection.io on these platforms;
- Rate us at AlternativeTo.net
- Star us on GitHub
- Follow us at Twitter/X
- G2 Software reviews
- Check us out on LinkedIn
- And tell your friends and colleagues :)
The more popular changedetection.io is, the more time we can dedicate to adding amazing features!
Many thanks :)
changedetection.io team
Registro de depuración de notificaciones
- Wed Oct 7 19:20:53 2026 - SENDING - [{"title": "ChangeDetection.io Notification - https://changedetection.io/CHANGELOG.txt", "body": "https://changedetection.io/CHANGELOG.txt had a change.\n---\n<s>HEAD / 2026-10-02 07:59:10 +0200:</s>\n<b>HEAD / 2026-10-07 16:24:24 +0200:</b>\n<b> - feat(jinja2): add unixtime filter to format Unix timestamps in notifications (#3641) (#4503)</b>\n---", "url": "tgram://8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/500917782/?format=text&avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png", "original_context": {"base_url": "https://changedetection.n8n-cloud.website/", "change_datetime": "2026-10-07 19:20:52 CEST", "current_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-10-07 16:24:24 +0200:\n - feat(jinja2): add unixtime filter to format Unix timestamps in notifications (#3641) (#4503)\n - Update pytest requirement from ~=9.0 to ~=9.1 (#4504)\n - Restock & Price detection - Fix decimal-comma prices ("39,99") being read as 3999 (#4493) (#4494), Warning: Could change previous values that were wrongly stored as 4999 -> 49.99 for example\n - i18n: Add ja translations for new UI (part 2) (#4491)\n\n - 0.60.8\n - i18n: Fix untranslated labels (#4488)\n - Use `lazy_pgettext` for condition Match label (#4480)\n - Title extract - Limit search window and improve regex - reduce memory usage (#4487)\n - LLM - Disable by default the fetching of price mappings from GitHub on startup\n - UI - CSS cleanups in LLM settings area\n - Update python-socketio requirement from <6,>=5.11.0 to >=5.17.0,<6 (#4486)\n - Update flask-wtf requirement from ~=1.2 to ~=1.3 (#4485)\n - UI - CSS - Mobile - Just remove disabled items, cleaner output.\n - UI - CSS - Mobile - Fixing padding on edit pages\n - UI - CSS - Mobile - Add little home button at top\n - UI - CSS - Mobile improvements\n - LLM - History/difference page - CSRF fix for LLM summary fetching between versions\n - Update selenium requirement from ~=4.31.0 to ~=4.49.0 (#4456)\n - Our first basic PWA mobile integration! Look for the QR-Code in Settings (#4472)\n - UI - Prevent accidental change of LLM Key (#4473)\n - LLM - Fixes for temperature/reasoning GPT-5 etc\n - LLM - UI nonblocking (#4469)\n - LLM timeout improvements (frontend) (#4470)\n - LLM UI - When LLM is disabled, hide it from the groups settings also (#4471)\n - Make LLM summary from UI non blocking (#4467)\n - Groups - UI fix for #4451 and tweaks (#4466)\n - UI - LLM - Tidy up styling\n - UI: make editing a configured LLM model discoverable (#4400)\n - i18n: Add ja translations for new UI (#4464)\n - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)\n - UI - sidebar - background fixes\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - "Add watch" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean "extract right now" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since "first check" was working really as "since last check", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: "Make a new JSON object with the timestamp")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - "Time between check" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - "Summary" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop "Last Checked" / "Last Changed" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] "Usage" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive "Show advanced help and tips" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use &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 `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview "GO" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - "Error 200 no content" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for "backups" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to "General" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, "batch mode" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German "From" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global "mute" and "pause" buttons on main menu, move "Backups" to "Settings" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run "clear all history" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from "General" to "Fetching" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert "Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to "Markdown to HTML" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty "ignore text" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends "text/xml" instead of the "application/atom+xml" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding "Strip ignored lines" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - "Time between check" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added "unread" view filter (#3393)\n - Enable "last_viewed" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving "real-time updates offline" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing "Does NOT contain" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of "quick watch add form" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under "Visual Selector" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how "different" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - "Recheck all" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including "Extract text", "Text to ignore", "Trigger text" and "Text that should not be present" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - "Conditions" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - "Clone" Should be "Clone & Edit" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set "RSS Color HTML Format" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding "Search" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new "Make all child elements visible" action\n - Browser Steps - Added new "Remove elements" action\n - UI - Browser Steps - "Click X,Y" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - "Unique lines" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - "Browser Steps" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `"Exception: No parsable JSON found in this document" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for "linuxserver" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - "Send test notification" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - "Send test" was not always following "System default notification format" (#2844)\n - Notifications - "Send test" was not always following "System default notification format"\n\n - 0.48.02\n - Notifications - "Send test" was not always following "System default notification format"\n - Notifications - Default notification format (for new installs) now "HTML color" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding "HTML Color" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - "Send test notification" in "Restock" mode was not working correclty when restock tokens "{{restock.price}}" were in the notification body (#2737)\n - #2727 Notifications - Fix "send test notification" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - "Block change detection when text exists" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - "Diff" button in overview list is now "History" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - "Filters & Triggers" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for "out of stock" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters "Trim whitespace" and "Remove duplicate lines"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add "click element containing text if exists" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with "`[ ] Empty pages are a change`" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding "Download latest HTML snapshot" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of "original price"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in "CSS/JSONPath/JQ/XPath Filters" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff "ignore text" highlight button (refactor, didnt work in "preview" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt "wheels" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in "importlib" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing "goto site" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added "Use default recheck time" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - "Send Test Notification" - In "Group" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - "Send Test Notification" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the "quick watch add" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - "Send Test Notification" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed "Include filters" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing "'Response' object is not subscriptable" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - "In stock" should be None/"Not yet checked" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - "Add new watch" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for "Click X,Y" step\n - API - Make sure the watch "is viewed" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the "[Diff]" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using "scraping browsers"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert "Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for "dynamic wachet" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to "bookworm" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - "Extract Text" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - "With errors" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy "limit to watches with errors" button (#1886)\n - UI - Viewing text differences - Tweaks to "Jump to next change" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe "current_snapshot" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - "recheck all" button should ignore blank/empty "tag" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select "No proxy" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by "date created" or "#" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the "unified patch format." (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - "Test notification" button in "Group Tag" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like "localhost" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as "OK" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update "Filter not found" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - "Search List" also works for 'Title' field\n - UI - New "Search List" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a "click" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for "clear/reset history"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for "clear/reset history"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to "Add Email" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding "Wait for text" and "Wait for text in element" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser "Service Workers" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action "Recheck"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable "Browser Steps" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing "Unable to retrieve content because the page is navigating and changing the content." on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert "don't process paused entries after queue", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in "paused" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example "//title/text()" in RSS feeds (#778)\n - Bug fix - Filter "Only trigger when new lines appear" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying "Visual Filter" tool as "Visual Selector Filter"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text "out of stock" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res "bug workaround" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random "jitter" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include "Extract text" filter\n - Improve error message when filter not found in page result (#666)\n - "Extract text" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - "Extract text" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a "[ ] default" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix "Add email" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via "source:https://website.com" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make "remove password" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - "Recheck" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env "FETCH_WORKERS" (#413)\n - Adding Env var "WEBDRIVER_DELAY_BEFORE_CONTENT_READY" to wait n seconds before extracting the text from the browser\n - Language fix "watches are rechecking." it actually puts them into an internal queue "watches are QUEUED for rechecking"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install "tar@>=6.1.2"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break "Cookie" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show "new version available" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - "Sassify" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show "preview" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "diff": "@changed_PLACEMARKER_OPENHEAD / 2026-10-02 07:59:10 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-10-07 16:24:24 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - feat(jinja2): add unixtime filter to format Unix timestamps in notifications (#3641) (#4503)@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changedetection.n8n-cloud.website/diff/72b4e58e-c3b3-4747-b20f-aed2073d0e67", "raw_diff": "@changed_PLACEMARKER_OPENHEAD / 2026-10-02 07:59:10 +0200:@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPENHEAD / 2026-10-07 16:24:24 +0200:@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN - feat(jinja2): add unixtime filter to format Unix timestamps in notifications (#3641) (#4503)@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1791393652.8601654, "prev_snapshot": " _ _ _ _ _ _ \n __| |_ __ _ _ _ __ _ ___ __| |___| |_ ___ __| |_(_)___ _ _ (_)___ \n/ _| ' \\/ _` | ' \\/ _` / -_) _` / -_) _/ -_) _| _| / _ \\ ' \\ _| / _ \\\n\\__|_||_\\__,_|_||_\\__, \\___\\__,_\\___|\\__\\___\\__|\\__|_\\___/_||_(_)_\\___/\n |___/ \n\nHEAD / 2026-10-02 07:59:10 +0200:\n - Update pytest requirement from ~=9.0 to ~=9.1 (#4504)\n - Restock & Price detection - Fix decimal-comma prices ("39,99") being read as 3999 (#4493) (#4494), Warning: Could change previous values that were wrongly stored as 4999 -> 49.99 for example\n - i18n: Add ja translations for new UI (part 2) (#4491)\n\n - 0.60.8\n - i18n: Fix untranslated labels (#4488)\n - Use `lazy_pgettext` for condition Match label (#4480)\n - Title extract - Limit search window and improve regex - reduce memory usage (#4487)\n - LLM - Disable by default the fetching of price mappings from GitHub on startup\n - UI - CSS cleanups in LLM settings area\n - Update python-socketio requirement from <6,>=5.11.0 to >=5.17.0,<6 (#4486)\n - Update flask-wtf requirement from ~=1.2 to ~=1.3 (#4485)\n - UI - CSS - Mobile - Just remove disabled items, cleaner output.\n - UI - CSS - Mobile - Fixing padding on edit pages\n - UI - CSS - Mobile - Add little home button at top\n - UI - CSS - Mobile improvements\n - LLM - History/difference page - CSRF fix for LLM summary fetching between versions\n - Update selenium requirement from ~=4.31.0 to ~=4.49.0 (#4456)\n - Our first basic PWA mobile integration! Look for the QR-Code in Settings (#4472)\n - UI - Prevent accidental change of LLM Key (#4473)\n - LLM - Fixes for temperature/reasoning GPT-5 etc\n - LLM - UI nonblocking (#4469)\n - LLM timeout improvements (frontend) (#4470)\n - LLM UI - When LLM is disabled, hide it from the groups settings also (#4471)\n - Make LLM summary from UI non blocking (#4467)\n - Groups - UI fix for #4451 and tweaks (#4466)\n - UI - LLM - Tidy up styling\n - UI: make editing a configured LLM model discoverable (#4400)\n - i18n: Add ja translations for new UI (#4464)\n - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)\n - UI - sidebar - background fixes\n - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)\n - System - Ensure import+API update values are verified types (#4458)\n - UI - Horizontal lines and styling fixes for #4424\n - UI - Sidebar spacing/colour fixes\n - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes\n - API - Rebuild docs\n - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)\n - UI - CSS - Mobile misc fixes\n - Update stock-not-in-stock.js - spanish\n - Docs - Adding price graph/restock info\n - Adding HTTP browser caching of UI elements (#4450)\n\n - 0.60.7\n - Set Cache-Control: no-store on dynamic responses by default (#4319)\n - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)\n - UI - CSS - Header menu item color fix\n - UI - Watch list - Move processor/mode to its own column\n - UI - Watchlist - Better alignment and icons\n - UI - Diff page - tabs should be consistent size with rest of app\n - UI - Watch list - Tidy up padding between cells\n - fix(http): send a single Date header on werkzeug built-in server (#4372)\n - "Add watch" UI tweaks (#4446)\n - UI - Giving checkbox operations way more contrast\n - General licence cleanups (#4445)\n - UI - Keep history diff title and controls visible while scrolling (#4412)\n - Fetch favicon candidates in parallel under one deadline, and stop the two ways it could hang (#4435)\n\n - 0.60.6\n - xPath filters - Stop LC_COLLATE deciding what contains() means (#4437) (#4438)\n - Puppeteer fetcher - Re-navigation cap must not mean "extract right now" (#4439)\n\n - 0.60.5\n - Favicon Setting - Adding a note that disabling this feature can speed up your page fetches/use less resources.\n - Page fetching - Terminate runaway page script before extracting, or a spinning renderer eats the whole fetch (#4433)\n - Favicon on/off - Was not actually applying at fetch time (#4432)\n - i18n: Update zh_Hant_TW translations (#4430)\n - Debounce the explicit gc.collect() storm on the watch-check path (#4431)\n - Dockerfile - actually generate locales, price formatting was falling back to C (#4429)\n - UI - Search modal - fix Enter dismissing the form instead of searching (#4428)\n - UI - Search modal - keep the search scoped to the tag you were viewing (#4425)\n - Search modal native submit (#4427)\n - Browser fetchers - Follow re-navigation, and one content-ready deadline (re-targets #4421 + #4422 at master) (#4426)\n - UI - Really fix #4413 #4419 - Mobile menu fix\n - Worker id/available fetcher (#4415)\n - UI - Really fix #4413 #4419 Counter bubble in minimal sidebar\n - Rebuild SCSS/CSS\n - feat(ui): show count badges in minimal sidebar (#4419)\n - Browser fetchers - Report the real status code when Chrome aborts a bodiless error response (#4420)\n - UI - 'Paused' status icon now has red dot instead of yellow #4418\n\n - 0.60.4\n - UI - Watch list - Minor tweak to cell padding\n - Rebuild translations\n - UI - Watchlist - bring back Restock & Price column to watchlist overview (#4410)\n - i18n: Update zh_Hant_TW translations (#4264)\n - UI - Watch list - Making list status icons larger, fixing icon text\n - UI - Groups - Fixing button alignment and using better form handling (#4409)\n - Rebuild translations\n - UI - Watch stats - Adding a little extra debug to 'Stats' tab\n - UI - Edit watch - Moving notification error alert to 'error' tab, hiding less used Page Title and Link options under foldout (#4406)\n - UI - Mobile - Recheck/edit/etc buttons - Centered horizontally\n - UI - Mobile - Tidy up row padding\n - UI - Watch list - Dont hide buttons on mobile, set light opacity on desktop\n - Performance - (watched page lister) open link single eval (#4405)\n - Rebuild translations\n - feature: Implemented optional override link (#4290)\n - Apprise notifications - Updating to 1.13.1 (#4404)\n - API - DELETE for Watch history #4397 (#4403)\n - Tests - Fix TestHistoryPathTraversal on macOS, and cover the containment check (#4390)\n - UI - Language selector menu-bar icon was cut off by a couple of pixels\n - Translations - Rebuild catalog\n - UI - 'Toast' notifications of actions was at the same height as menu tabs, moved down slightly.\n - UI - Left menu folds out ONTOP of content, Improving VisualSelector & BrowserSteps width, Darkmode transitions off, Extra sidebar modes #4380 (#4401)\n - i18n: add Indonesian translation (#4402)\n\n - 0.60.3\n - GHSA-56fq-63vj-9992 Add-watch-UI should be POST/CSRF protected @AmerMrkaljevic (#4375)\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404\n - UI - Fixing lots of actions that should be a `POST` style action which led to a 404 (#4370)\n - Translations - support for translation overlays/local translations of existing strings (#4365)\n\n - 0.60.2\n - fix(conditions): support zero values in condition filtering and json logic conversion (#4362)\n - fix(api): accept an existing tag UUID in the watch `tag` field, and deprecate it (#4361)\n - Feature/Watch limit - Adding test (#4360)\n - Env var - `PAGE_WATCH_LIMIT` enhancements (#4359)\n - Watch loading - Dont crawl whole disk, just check each directory for a watch.json/tag.json (#4358)\n - fix(llm): support Gemini flash-lite & reasoning models, strip extra_body on 400 retry (#4342)\n - Docs - rebuilding API docs\n - Update - pyppeteer-ng to 2.0.0rc16 (#4357)\n - LLM - Per watch/group settings and UI tidyup (#4354)\n - UTF-8/Lone Surrogate encoding test improvements related to #4273 (#4353)\n - Memory usage - small improvement by tidying up module imports (#4352)\n - Pause Queue - Best to pause it in the watch loop so that it works with very long lists of watches\n - Scheduler+API Bug - if an invalid timezone was set (through edit of watch or API) it could have crashed the scheduler, Added `timezone` to the official API docs (#4350)\n - Memory - GC freeze after startup to save CPU cycles and improve memory management (#4351)\n - fix(llm): handle reasoning blocks that aren't a well-formed <think>...</think> pair (#4349)\n - fix(llm): string boolean parsing, reasoning model <think> stripping, and timestamp diff annotation (#4340)\n - Python 3.10 EOL October/2026 - Dropping support - conflicts with jsomschema and litellm (#4347)\n - Puppeteer/Playwright CSP bypass - test refactor (#4346)\n - fix(backup): add utf-8 encoding when writing url list files (#4345)\n - Puppeteer fetcher - page crash handler (if there wasnt one, it could have crashed the CDP session)\n - deps: update litellm dependency cap (#4341)\n - fix: Browser Steps picker cannot select a <select> nested in a <div> (#4336)\n - Add watch UI - Tidying up logic around browser selection/visibility\n - Restock detection - fix inverted condition that skipped the OpenGraph availability fallback (#4262)\n - feat: make Playwright CSP bypass configurable (#4298)\n - Add watch UI should show which browser(s) are available and set default browser (#4334)\n - Add Ukrainian support for the 'In stock'/'Not in stock' status (#4330)\n - translations - recompiling\n - Add Polish translation (#4329)\n - LIBXML Data integrity fix, libxml must be locked across threads for any XML parsing (#4325)\n - GHSA-23mp-8222-96fr - reflected XSS in /diff/<uuid>/download-patch via from_version - Using built-in plain text response instead. Reported-by: Mayssare Amakhtari (@cy3erm)\n - Build robot - Bump actions/setup-python in the all group across 1 directory (#4291)\n - GHSA-q85w-c766-h5g8 - Advisory for four unprotected routes in price_data_follower, check_proxy and language handling that missing. Reported-by: Mayssare Amakhtari (@cy3erm) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>\n - ghsa-gwph-fp79-379w - changedetection.io SSRF protection bypass via CGNAT addresses, also adding to `ALLOW_IANA_RESTRICTED_ADDRESSES` behaviour.\n - GHSA-4j9m-cxq4-9c36 - Improved validation Stored CSS Injection via `tag_colour` Field (#4317)\n - GHSA-56fq-63vj-9992 Improved URL filtering (#4315)\n - RSS - RSS pubDate is wrong on any non-UTC container: local time is relabelled as UTC - #4309 (#4314)\n - feature: allow a watch or group to append to the inherited AI Change Summary prompt (#4294)\n - CSRF - Test fix (#4316)\n - Move development tools out of runtime requirements (#4280)\n - Security: hide the running version from anonymous visitors when a password is set (#2190) (#4306)\n - GHSA-3v57-xv5m-v7m7 - Multiple front-end endpoints lacking CSRF protection\n - Security - GHSA-mh42-m7cg-49fr - Authenticated path traversal to arbitrary file write via the watch `processor` field (enum bypassed through /imports/import)\n - Update docker-compose.yml - Adding `ALLOW_IANA_RESTRICTED_ADDRESSES` description\n - UI - Change 'Live' to 'Running' makes more sense\n - UI - Move rendering of each watchlist row out of the watchlist main template so it can be re-used by the realtime update (#4305)\n - fix: avoid division by zero when logging watch load rate (#4289)\n - fix: invalidate favicon cache when clearing watch history (#4286)\n - Improved content type detection - adding regression test\n - Update magic.py - Fixing fallback for page type (plaintext, html etc) the fallback didnt correctly catch all `text/html` types, Re #4302\n - fix: sanitize lone unicode surrogates before filtering JSON (#4293)\n - fix: Visual Selector renders scraped selectors as text, not markup (#4282)\n - LLM - Counter stats - Fix LLM token counter race condition (#4276)\n - Watch history - fix for restock.previous_price returns the first-ever price once a watch has 3+ snapshots (#4268)\n - fix: watches auto-tagged by group url_match_pattern regex missing from group tab filter (#4267)\n - UI full refactor / upgrade (#4183)\n - fix: report the actual 1-based failed browser-step number (#4200) (#4258)\n\n - 0.55.8\n - [feature] Restock LLM fallback: make the 8000 char content limit configurable, change to 15,000 chars by default #4213 (#4257)\n - [i18n] JavaScript UI strings not covered by translations #4233 (#4255)\n - Translations - Use shorter Russian translations for main watchlist UI buttons\n - LLM - Raise or remove LLM timeout when local endpoint detected #4225 (#4254)\n - fix: safe-empty restock default so restock notification tokens work for any watch (#4249)\n - fix: don't error watches when Content-Type is JSON but body isn't parsable (#3827) (#4250)\n - Build - Bump the all group across 1 directory with 2 updates (#4238)\n - Add Russian (ru) translation (#4236)\n - fix: gitignore the actual test-log path (changedetectionio/tests/logs) (#4247)\n - fix: URL validation rejects valid URLs with '|' in the anchor/fragment (#4209) (#4243)\n - LLM: strip sampling params and retry when the model rejects them (#4241)\n - fix: ensure all RSS endpoints bypass global auth when using token (#4235)\n - Restock - Threshold change since "first check" was working really as "since last check", update UI, tests, field name.\n - Restock - test fix\n - fix: extract <title> from pages with large <head> sections (#4217) (#4220)\n - Updating language catalog\n - feat: Czech translation updated and refined (#4203)\n - Update docker-compose.yml - adding LLM_FEATURES_DISABLED example\n\n - 0.55.7\n - UI - LLM - Fix for settings (wtforms vs pydantic) (#4184)\n - LLM - Smarter reasoning budget logic for gemini models\n\n - 0.55.6\n - Security - SSRF in ChangeDetection.io via urlparse/urllib3 Parser Differential\n - lint: Bump dennis \u2014 adopt `--strict` mode and drop false-positive workarounds (#4182)\n - Code - LLM settings pydantic refactor (#4181)\n - LLM UI - Blueprint/code also disabled when env flag LLM_FEATURES_DISABLED is enabled (#4180)\n - Notifications - `raw_diff` token was missing (#4177)\n - UI - LLM - Flag `LLM_FEATURES_DISABLED` to disable all LLM from the UI/system (#4171)\n - UI - Preview problem fix for extract_text/ignore_text #4138 (#4169)\n\n - 0.55.5\n - LLM - Master on/off switch (enable/disable) (#4162)\n - Notifications - Fix `'str' object is not callable` when `{{ diff(...) }}` callable tokens are used with HTML/htmlcolor output (#4161)\n - Fix Spanish translations for 'Changed' and 'Last Changed' (#4160)\n\n - 0.55.4\n - API Security - Watch GET history snapshot - Should return `text/plain` mimetype so it cant be accidently executed in the browser (#4158)\n - UI - LLM - SSRF guard for the LLM `api_base` setting (#4157)\n - LLM - UI & Ollama tweaks (#4148)\n - Update Language compilation\n - UI / LLM - Model name should not be 'read only', tidy up drop down list of providers #4115\n - Docker - INSTALLED_MARKER is kept in /datastore but package installs are not persistent (Dont use custom marker file, rely on pip instead) (#4147)\n - Fix/pr 4110 czech l12n catalog sync (#4145)\n - Text filters - Ignore text should run before 'extract text' (#4143)\n - API - Better support for watch API private/internal vars\n - Text filters - Process subtractive_selectors first (#4142)\n - LLM - Fixing summary cache miss-hit (#4136)\n - LLM - UI - Message that 'AI Intent' (triggers) need a bigger model\n - LLM - Allow better override of formats and rules for intent/triggers\n - LLM - Remove the 'format' info from the system prompt so you can create your own 'summary' formats (ie: "Make a new JSON object with the timestamp")\n - UI - Make LLM status sticky (#4135)\n - LLM - Bumping default prompt\n - LLM integration - LiteLLM config - UI tweaks (#4134)\n - LLM - Self-hosted OpenAI-compatible endpoint support (vLLM, LM Studio, llama.cpp) \u2014 refs #3204 (#4117)\n - UI - "Time between check" fields re-order labels. #4128\n - HTML escaping in HTML notifications - Bumping tests (#4131)\n - HTML hygiene fix/improvement (Dont allow unescaped HTML to become real HTML in notifications)\n - Fixing GHSA-vwgh-2hvh-4xm5 \u2014 substring match in the shared_diff_access, improve access control to shared diff access (#4130)\n - Notifications - Escape only the diff variables before Jinja2 renders them into the template ( Stop breaking custom HTML for plaintext pages on HTML notifications) #4121 (#4123)\n - Notifications - extra check for system default #4119 (#4122)\n - i18n: Fix broken HTML tags and enforce dennis lint warnings in CI (#4116)\n - i18n: Clear pre-existing dennis warnings in `messages.pot` (#4112)\n - i18n: Enforce dennis lint warnings in CI (#4105)\n - API - Add restock config to API /v1/watch/ json output #4099 (#4103)\n - API - watch.link was accidently a tuple, enforcing string (#4104)\n - i18n: Add dennis .pot/.po lint (#4097)\n - Improve LiteLLM deps #4093 (#4102)\n - UI - AI/LLM - "Summary" button should set last viewed (#4095)\n - Ruff INT (flake8-gettext) (#4096)\n\n - 0.55.3\n\n - Recompile languages\n - 0.55.2\n - typo: {{diff_url}} token mentioned twice (#4094)\n - i18n: UI - Align desktop "Last Checked" / "Last Changed" with mobile (#4090)\n - UI - AI/LLM - OpenRouter config UI was missing the correct fields. #4091\n - Freeze POT-Creation-Date at sentinel to stop per-locale churn (#4092)\n - i18n - Recompile languages\n\n - 0.55.1\n - Security - Hardening XML parser against XXE\n - Security - Stored XSS via Tag Name in Modal Dialog\n - Security - Arbitrary Local File Read via crafted backup restore\n - i18n - Update Korean language (#4084)\n - [i18n] "Usage" tab label in AI / LLM settings is ambiguous across contexts #4086 (#4088)\n - Translations - Playwright macro unused, add extra linting for translations, add TRANSLATORS.md (#4087)\n - i18n: Consolidate fragmented gettext calls into entire-sentence msgids (#4076)\n - LLM / AI Change detection rules and Summaries\n - Bumping README\n - DeprecationWarning: codecs.open() is deprecated. Use open() instead. (#4078)\n - CI - Translation sync check (#4085)\n - Update python-engineio requirement from <5,>=4.9.0 to >=4.13.1,<5 (#4079)\n - CI - Re #4080 msgfmt linting (#4081)\n - i18n: Wrap untranslated UI strings in include_subtract.html and add ja translations (#4054)\n - UI - Fix broken opacity feedback for restock/price fields on tag edit screen (#4072)\n - UI - Use pgettext for diff page From/To labels to prevent context collisions (#4073)\n\n - 0.54.10\n - UI - Fix unresponsive "Show advanced help and tips" button on tag edit screen (#4055)\n - Fix untranslated labels on mobile watchlist view (#4064)\n - Fix - diff_changed_to causing some missed notifications #4063 #3818 (#4066)\n - Bump apprise from 1.9.8 to 1.9.9 (#4059)\n - i18n: Wrap untranslated UI strings and update ja translations (#4052)\n\n - 0.54.9\n - Ignore text should override trigger text (It should ignore the trigger text if it appears) (#3450)\n - Translations - JA - Recompile\n - Fix strings not rendered in user's locale despite having .po entries (#4051)\n - Update Japanese translations for new strings and fix fragment handling (#4050)\n - Notifications - Discord #3721 - Dont use &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 `<head>` section (#4011)\n - Update docker-compose.yml\n - Update docker-compose.yml\n\n - 0.54.7\n - Translations - recompiling\n - fix: Czech translation strings updated (#4008)\n - Security: XPath json-doc() Arbitrary File Read Bypass ( Similar fix as CVE-2026-29039 )\n - CVE-2026-33981 - Environment Variable Disclosure via jq env Builtin in Include Filters\n - UI - Settings - Dont let 'password' field autocomplete (chrome)\n - `last_error` should be cleared if page content was the same and there was no error (#3997)\n - fix: correct critical errors in Spanish (es) translation (#3994)\n - Restock - Add previous_price to restock values #3987 (#3993)\n - UI - Scan/check all proxies - Regression fix from earlier refactor\n - Realtime - Suppress socket.io errors in logs (#3991)\n - UI - Text tidyup (#3989)\n\n - 0.54.6\n - SONP - Attempt to strip out JSONP, treat as plaintext (#3983 #3982)\n - Content Fetchers / Browsers - Improvements for pluggable extra fetchers/browsers. (#3981)\n - fix: add commit calls for pause and mute operations (#3978)\n - Bump apprise from 1.9.7 to 1.9.8 (#3979)\n\n - 0.54.5\n - CI - YML tidyup\n - Docker image - Improving org.opencontainers labels for dev containers\n - Docker image - Improving org.opencontainers labels #3794\n - API - Invert `changes_only` flag for include_equal parameter, add test, fixes `changesOnly` option for history diff API call (#3976)\n - UI - Fixing Preview "GO" version button (#3969)\n - API - Create (POST) tag/group through API do not save processor_config_restock_diff values #3966 (#3968)\n - Add complete Spanish translation (es) (#3961)\n - Various memory and CPU improvements (#3960)\n - CI - Bump the all group with 5 updates (#3955)\n - UI - Restock/pricing - Handle when price amount is sometimes string or integer (#3950)\n - Content fetching -Better detection of other encodings, Replace/upgrade broken UTF-8 , Ensure rest of retrieved content is UTF-8 for the app (#3954)\n - Restock - No need to extract the text because it's not used anyway (#3951)\n\n - 0.54.4\n - CVE-2026-29038 - Reflected XSS in RSS Tag Error Response\n - CVE-2026-29039 - XPath - Arbitrary File Read via unparsed-text()\n - CVE-2026-29065 - fix(backups): patch zip slip advisory, zip bomb, upload size limit, UUID validation, secret.txt leakage, and download edge cases\n - Updating API docs with better processor plugin info (#3942)\n - Python 3.14 CI test and support (#3941)\n - fix(i18n): accept translated confirmation text when clearing snapshot history (#3940)\n\n - 0.54.3\n - CVE-2026-27696 Small fix - Restricted hostnames can still be added but are only checked at fetch-time (not when rendering lists etc) (#3938)\n - Adding Ukranian translations, rebuilding translations. (#3936)\n - Update messages.po in French translation (#3926)\n\n - 0.54.2\n - Unresolvable hostnames should still be added, they are checked for security at fetch time (#3933)\n - CI workflow - Bump the all group with 2 updates (#3931)\n - Update jsonpath-ng requirement from ~=1.7.0 to ~=1.8.0 (#3929)\n - API - Processors configuration is now part of the API (#3902)\n - Notification Token {{diff}} can accept arguments like `{{diff_added(lines=5, context=2)}}` (#3923)\n - Fixing `change_datetime` notification token (and adding test) (#3922)\n\n - 0.54.1\n - Tests - Tweaks to upgrade path tests\n - Tests - Run upgrade path test with ALLOW_IANA_RESTRICTED_ADDRESSES=true\n - CVE-2026-27696 - Server-Side Request Forgery (SSRF) via Watch URLs, set env var `ALLOW_IANA_RESTRICTED_ADDRESSES` to `true` to access IANA reserved URLs such as http://169.254.169.254, http://10.0.0.1/, http://127.0.0.1/, etc.\n - CVE-2026-27645 - Reflected XSS in RSS Single Watch request\n\n - 0.53.7\n - Libraries/Build - unpin referencing library (#3919)\n - Bump referencing from 0.35.1 to 0.37.0 (#3677)\n - Upgrading flask-socketio and related packages with security updates ( #3910 ) (#3918)\n\n - 0.53.6\n - Pip installs - remove flask patch and pin library versions\n - Lazy load flask_compress\n - UI - Content compression was not obeying FLASK_ENABLE_COMPRESSION, should be off by default due to a memory leak in flask_compress & socket.io\n\n - 0.53.5\n - Fixing bad replacement of metadata causing possible content removal #3906 (#3908)\n - UI - Backup restore (#3899)\n\n - 0.53.4\n - Updates/migration - Re-run tag update, re-save to cleanup changedetection.json, code refactor (#3898)\n - UI - Search modal - fixes for running in sub path\n - Puppeteer - Adding extra browser cleanup (#3897)\n - Puppeteer - Use a modern scroll method for screenshot stitching\n - UI - CSS - Ensure 'difference' 'preview' both wraps by word and by very long strings\n - Fix: Some SPAs with long content - Stripping tags must also find matching close tag (#3895)\n - Fix: Some SPA's also set body content to display: none which breaks text output\n - "Error 200 no content" - Some very large SPA pages make HTML to Text fail by dumping 10Mb+ into page header, strip extras. (#3892)\n - UI - Filters & Triggers - Adding reminder that you can also use 'Conditions' for trigger rules\n - Minor code tidy\n - Fix time schedule off-by-one bug at exact end times for all durations and add comprehensive edge case tests Re #846 (#3890)\n - UI - More fixes for realtime updates\n - UI - Fixing realtime updates for status updates when checking (#3889)\n - Pluggy plugin hook for before and after a watch is processed (#3888)\n\n - 0.53.3\n - API - Adding automated test for API with NGINX sub-path, Skip validation errors about server path (allows use on sub-paths/reverse proxy etc) (#3886)\n - UI - Use version from code in version tab\n\n - 0.53.2\n - UI - Watch overview - Restock price, validate number before output (#3883)\n - Security - Adding small test and fixing overzealous filename cleaner (#3884)\n - Datastore - On fresh installs, also scan for existing watch.json watches in subdirectories\n - Security CVE-2026-25527 - Unauthenticated static path traversal in resources\n - Browser Steps - Minor code cleanup\n - UI - Browser Steps - First step was missing Clear / Remove / Pic buttons\n\n - 0.53.1\n - Browser Steps - Clean off empty fields on save/update (UI and API), small refactor Re #3874, #3879 (#3880)\n - Test - Improve test for watch package download\n - UI - Watch data download, fix test, update text.\n - UI - Ability to download a complete data package (.zip) of a watch (#3877)\n - Disable content compression of HTML/etc by default due to memory leak between flask_socketio and flask and flask_compress.\n - Avoid reprocessing if the page was the same (#3867)\n - Update python-socketio requirement from ~=5.16.0 to ~=5.16.1 (#3869)\n - API - Remove `flask_expects_json` validation, this is covered entirely by OpenAPI, update OpenAPI spec. (#3871)\n - Update python-engineio requirement from ~=4.13.0 to ~=4.13.1 (#3868)\n - Price tracker - Use a more memory efficient price scraper, use subprocess on linux for cleaner memory management. (#3864)\n - Refactoring upgrade path (#3861)\n - API - Import use background task to import large lists (#3858)\n - API - Bumping docs\n - API - Import - Ability to set any watch value as HTTP URL Query value, for example ?processor=restock_diff&time_between_check={'hours':24} Re #3845 (#3857)\n - API - Include missing `tags` in fetching watch information. #3854 (#3856)\n - UI - Bulk checkbox operations modal confirmation fix Re #3853\n - Tags update fix (#3849)\n - Refactor for Tags storage (#3848)\n - Including uptime in UI settings/info\n - Refactor watch saving backend, closes #3846 (#3847)\n - Bump psutil from 7.2.1 to 7.2.2 (#3844)\n - Bump pyppeteer-ng from 2.0.0rc12 to 2.0.0rc13 (#3843)\n - Fix for When MoreThanOnePriceFound() is raised, plugins dont fire #3840 #3833\n - Rebuild translations (#3842)\n - UI - Favicon use lazy load for faster rendering\n - Adding more tests and Watch object improvements (#3841)\n - Improved watch global settings handling (#3839)\n - New datastore message should be warning not critical\n - Improving upgrade path\n - History length limit size option (#3834)\n - Memory improvement - Use builtin markupsafe instead of creating a jinja2 template env each time for small strings (#3836)\n - Favicon path - cache results\n - UI - Backups tab - styling fix\n - Styling fix for "backups" tab Re #3821\n - UI- Fix possible bug adding tags in quickwatch form\n - Processor plugin improvements - Now supports creating your own processor (for example, monitor DNS changes) (#3739)\n - Bump elementpath from 5.1.0 to 5.1.1 (#3799)\n - Puppeteer and Playwright browser close/shutdown improvements (#3830)\n - Refactor of queue systenm and improve tests, improves multiple workers (#3826)\n - Ability to limit total number of watches with env var PAGE_WATCH_LIMIT (#3828)\n - UI - Move Default Proxy selection back to "General" tab\n - API - Notification URLs werent always being validated (#3812)\n - Remove deprecated call to strtobool\n - UI - Make watch tags link elements (#3813)\n - test tweak\n - DB data migration upgrade fixes (#3811)\n - Big refactor to save watches as their own datafile with some agnostic data store backend, saves writing a huge JSON file every time (#3775)\n - Improved catching of errors/exceptions in Browser Steps steps (#3808)\n - Improving default settings for remote reverse proxies (#3806)\n - CLI extra options, "batch mode" see `--help` allows re-checking and adding watches from the CLI (#3802)\n - Update messages.po // German (#3797)\n - Bump apprise from 1.9.6 to 1.9.7 (#3800)\n\n - 0.52.9\n - Memory management improvements for large screenshots, Brotli snapshot improvements (#3798)\n - Updating site.webmanifest for PWA usage\n - Use credentials to fetch web manifest (#3790)\n - Make language selection sticky and provide a way to return back to default auto-detect #3792 (#3795)\n - Element locking 'off' by default (so they dont move when the screenshot scroll happens), only lock top viewport elements. Improve logging. (#3796)\n - Rebuilding language translation files\n - Update French translation (#3788)\n - Open github link on new tab (#3791)\n - Update messages.po // German "From" (#3793)\n - Improving container version labeling, using `master` branch as docker `:dev` tag. Re #3794\n\n - 0.52.8\n - Memory - Favicon reader had a memory leak, Restart fetch workers between jobs, misc tweaks (#3787)\n - API - Validation improvements (#3782)\n - i18n - zh traditional chinese autodetect from browser fix\n - UI - Fixes for search dialog #3778 (#3781)\n\n - 0.52.7\n - Fix zh PO duplicates and complete new translations. (#3773)\n - Lots of translation updates (#3772)\n - UI - Global "mute" and "pause" buttons on main menu, move "Backups" to "Settings" (#3769)\n - API & UI - Recheck all - Dont requeue existing queued or processing watches. (#3770)\n - Non blocking improvements (#3767)\n - Improvements to deterministic fix (false triggers) (#3766)\n - Run "clear all history" in background thread to prevent blocking (#3765)\n - Test - Adding missing test\n - Important fix for possible wrong detection of changes under high-concurrency setups (many many fetch workers)\n - Language updates (#3764)\n - Queues and Scheduler - No need to add imported items to the check queue, the scheduler will do this #3762 (#3763), CPU usage improvements.\n - UI - Fixing link to scheduler help/tutorial page.\n - Manual update of DE language (and recompile all languages)\n - Recompile CSS\n - UI - Mobile - Empty page watches message and layout improvements (#3760)\n - UI - CSS - Give dark-mode switching a soft transition\n - Edit - More reliable fetch of watch on test (usually affects tests)\n - Manual polish for several translations in the zh locale. (#3757)\n - Fix for old selenium 3 (#3748 #3756), however be sure to use selenium 4.\n - Languages - Recompile languages, small fix for 'de'.\n - Bump elementpath from 5.0.4 to 5.1.0 (#3754)\n - Update zh translations with improved, consistent Simplified Chinese UI copy. (#3752)\n - Bump apprise from 1.9.5 to 1.9.6 (#3753)\n - 0.52.6\n - Selenium fetcher - Small fix for #3748 RGB error on transparent screenshots or similar (#3749)\n - UI - Show queue size above watch table in realtime\n\n - 0.52.5\n - Revert sub-process brotli saving because it could fork-bomb/use up too many system resources (#3747)\n - i18n: Recompile zh_Hant_TW/LC_MESSAGES/messages.mo\n - i18n: Update zh_Hant_TW translations (#3745)\n - Update jsonschema requirement from ~=4.25 to ~=4.26 (#3743)\n - Translations - ZH_Hant_TW - Fixing `timeago` string handling #3737\n - Translations - Fixing `zh_TW` to `zh_Hant_TW` , adding tests #3737 (#3744)\n - Bump pyppeteer-ng from 2.0.0rc10 to 2.0.0rc11 (#3742)\n\n - 0.52.4\n - Fixing Traditional Chinese locale mapping #3737 (#3738)\n - Languages - Pypi/pip package was missing translations\n\n - 0.52.3\n - UI - Groups - Adding 'Recheck' button from groups overview page\n - Minor playwright memory cleanup improvements (#3736)\n - Browser Steps UI async_loop bug, refactored startup of BrowserSteps, increased test coverage. Re #3734 (#3735)\n\n - 0.52.2\n - Page fetchers - Were not truely running independently and could have been blocking eachother, this commit speeds up page fetches where there is more than 1 worker.\n - RSS - Bugfix - possible edge case of wrong feed info could be rendered (#3733)\n - UI - Language modal - flag icons should be round\n\n - 0.52.1\n - Development branch merge into release/master\n - Adding test for #3720\n - Testing - fix: Replace time.sleep with wait_for_notification_endpoint_output in test_notification (#3716)\n - Update README.md - Info about setting up different viewport sizes\n - Use soft delays instead of blocking time sleeps in scheduler (#3710)\n - API - Watch get, retry watch data if watch dict changed (more reliable)\n - Notification debug log - Use locale of system for dates/times\n - Misc small HTML Validation fixes (#3704)\n\n - 0.51.4\n - Improving UTF-8 handling for xPath selectors (Stop the xpath filter from chewing up non-regulat-latin-text style content) (#3659)\n - Bump actions/checkout from 5 to 6 in the all group (#3651)\n - Specify UTF-8 encoding for xpath_element_js (#3650)\n - Update playwright library to 1.56\n\n - 0.51.3\n - RSS Reader Mode parser improvements - Pick up all fields from RSS where possible, better auto-detect of the XML encoding if it wasnt set by the browser (#3646)\n\n - 0.51.2\n - RSS - New Settings option for making RSS follow the format of `Notification Body` across watch/group/etc, or system default and override the format with your own as you like.\n\n - 0.51.1 Fixing semver version number\n\n - 0.51.01\n\n - 0.51.00\n - UI - Minor text fix for anon history access\n - RSS per watch tweaks (#3635)\n - RSS Feed per watch - Setting order (newest changes first) (#3634)\n - UI - Moving 'RSS' options to its own settings tab, RSS - Adding watch history length (#3633)\n - RSS per group! (#3632)\n - UI - Move 'Jitter seconds' settings tab from "General" to "Fetching" global Settings.\n - README typo fix and ignore files for emacs style backups\n - RSS feeds for a single watches!\n - Always backup JSON DB on new versions as well as the existing between updates.\n\n - 0.50.43\n - Forcing UTF-8 when reading JSON DB (Fixes data not loaded for some platforms #3622 #3611 #3628), Always create new versions of the backup DB if one exists for that step when running updates, Adding extra sanity checks on DB load\n - Adding data sanity checks across restarts (#3629)\n\n - 0.50.42\n - Revert "Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)"\n\n - 0.50.41\n - Windows - JSON DB fixes - Forcing utf-8 for json DB read/writes should solve windows saving/loading problems. (#3615 #3611)\n - Update orjson requirement from ~=3.10 to ~=3.11 (#3617)\n\n - 0.50.40\n - Page <title> should only be captured on HTML documents (#3608)\n - Notification body/title - Fixing validation on empty strings #3606 (#3607)\n - Real time UI - Remove polling thread for updates - it's all done realtime by signals (#3603)\n - Watch history - Don't rescan whole history.txt when looking up a timestamp <->filepath (#3602)\n - Datastore - Use `orjson` for faster saves (#3601)\n - Scheduler - Saving a couple of CPU cycles in logging strategy\n\n - 0.50.39\n - Time scheduler - Remove cache on time lookup\n - Tests - Adding extra placemarker tests (#3592 #3591 )\n - Update jsonpath-ng requirement from ~=1.5.3 to ~=1.7.0 (#3586)\n - Bump actions/download-artifact from 5 to 6 in the all group (#3585)\n - Update pytest-flask requirement from ~=1.2 to ~=1.3 (#3587)\n - Update python-socketio requirement from ~=5.14.2 to ~=5.14.3 (#3588)\n - API - Adding better explanation and usage of History API, bumping doc versions.\n - API - Rebuilding HTML docs\n - API - Support optional processor on Watch create to set the restock_diff or text_json_diff mode on watch create.\n - Notifications - Adding `{{diff_full_clean}}`, `{{diff_removed_clean}}`, `{{diff_added_clean}}`, `{{diff_clean}}` notification body tokens for using in templates without (added)/(removed) text. (#3580)\n\n - 0.50.38\n - Improved send test notification handling (#3579)\n\n - 0.50.37\n - Fixing title markup in notifications (title/subject for email, slack etc), refactoring line-feed logic `\\n` -> `<br>` etc (#3577) #3538 #3576\n - Dockerfile cache tweaks and build layer github cache re-enable (#3575)\n\n - 0.50.35\n - Notifications - Text and Markdown type was not migrated correctly to the new settings, resulting in possible non-notification, #3572 #3559 #3558 #3573\n - API - Updating index.html of the documentation\n - Optimisations to GitHub test flow\n\n - 0.50.34\n - Fixes to notification '`Send test notification`' (#3571)\n - HTML Notification - Adjusting font to rem size\n - Run all pytests in parallel (#3569)\n - Unify safe URL checking to the one function, strengthen tests and filters (#3564)\n - Build/test - Parallel test jobs for faster testing (#3568)\n - Handle `format=` in apprise URLs (#3567)\n - Adding small amount of cache to common functions (#3565)\n - CVE-2025-62780 - Stored XSS in Watch update via API\n\n - 0.50.33\n - Fixing wrong notification type in <select> that lead to wrong type of notifications (plaintext vs html) being sent #3558 (#3559)\n - HTML - Shorten whitespace around timezone names\n - Update 21 for #3496 - Fixing update of timezone setting\n - OpenAPI specification, fixing enum for notification type, and notification_muted (#3557) Re #3556\n - Update brotli requirement from ~=1.0 to ~=1.1 (#3553)\n - Update wtforms requirement from ~=3.0 to ~=3.2 (#3551)\n - Build - Actions / Bump the all group with 2 updates (#3550)\n - Update python-socketio requirement from ~=5.13.0 to ~=5.14.2 (#3552)\n - RSS - Update feedgen requirement from ~=0.9 to ~=1.0 (#3554)\n\n - 0.50.32\n - Tests - API - Import - Removed 'content-type': 'text/plain' from the test because this should be assumed.\n - API - Import - Automatically assume text/plain content type on Import (makes it easier for changedetection to add new URLs) #3547 #3542\n - Notifications - Keep monospaced layout of history/difference sent to HTML style notifications, Fixes to Markdown #3540 (#3544)\n - Notifications - Preserve original document whitespace in HTML style notifications (#3546)\n - Notifications - `post://', `put://` etc - Catch and show errors and where possible (#3543)\n - HTML Notification Color fixes - Reverting colors and using older style (#3545)\n\n - 0.50.31\n - Changes to colors HTML notification (small contrast between 'changed' and 'removed' etc) (#3540)\n - tgram:// and discord:// - Small fix for line breaks\n - Notifications fixes, extensive testing of all tokens, fixing text markup in HTML emails etc #3529 (#3539)\n\n - 0.50.30\n - Notifications fixes (#3534) #3531 #3530 #3529\n - Template - Adding `|regex_replace` Re #3501 (#3536)\n - Be sure that default namespaces are registered (#3535)\n\n - 0.50.29\n - Discord + Telegram - Adding better styling (Discord now uses strike-through and bold for removal/additions instead of broken HTML) (#3528)\n - Notifications - Refactor/cleanup notification handling and rename 'Markdown' to "Markdown to HTML" to make more sense. (#3527) Re #3526 -\n - UI - Fix watch table striping on delete #3523\n - Update flask requirement from ~=2.3 to ~=3.1, unpin werkzeug (#3502)\n - Bump elementpath from 4.1.5 to 5.0.4 (#3470)\n - Update beautifulsoup4 requirement (#3471)\n - Update validators requirement from ~=0.21 to ~=0.35 (#3500)\n\n - 0.50.28\n - Email notification format fixes (#3525)\n - Empty "ignore text" lines could break ignore text and prevent changes from being detected (#3524)\n\n - 0.50.27\n - Fix error handling for first empty filter response (#3516)\n\n - 0.50.26\n - pip build - Improving fix for #3509, Adding automated test for #3509\n\n - 0.50.25\n - pip build - Be sure to include API spec (#3511)\n - Improved watch delete (#3510)\n - Notification service improved failure alerts for filter missing + browsersteps problems (#3507)\n - Notifications - Small fix for notification format handling, enabling HTML Color for `{{diff_removed}}` and `{{diff_added}}` (#3508)\n\n - 0.50.24\n - Notification - Make sure all notification tokens have something set even for form validation, fixes `hassio://` with `{{ watch_uuid }}` in notification URL form (#3504)\n\n - 0.50.23\n - Replace jinja2-time with `arrow` and improve timedate timezone integration, fixes timezones in templates such as `{% now 'Europe/London', '%Y-%m-%d' %}` etc (#3496)\n\n - 0.50.22\n - Testing - Adding test for requests timeout setting #975\n - UI - Add missing 'requests timeout in seconds' field to main settings, Re #975\n - UI - Proxy and external browser settings URL validation (#3494)\n - Move proxy default selection to proxy tab\n - Build - Splitting memory report (#3493)\n - Replace stream/filetype detection library with `puremagic`, 20Mb less RAM usage (#3491)\n\n - 0.50.21\n - Adding 'RSS reader mode' (see main Settings) (#3488)\n - Re #3486 - Fixing and adding test for RSS/Atom not being converted to text when server sends "text/xml" instead of the "application/atom+xml" header (#3487)\n - Ensure JSON is always correctly reformatted with padding (#3485 #3482)\n - No need to reformat/reprocess content in the case that no filters were found (#3484, #3483)\n\n - 0.50.20\n - PDF - Will trigger a change - Fixing output, also reported original size of document was incorrect (it was the size of the HTML output after conversion from PDF), Improving tests (#3481)\n\n - 0.50.19\n - Test speedup - remove common calls for function calls (#3477)\n - Reducing memory usage (#3476)\n - Refactoring text/html difference processor (#3475)\n\n - 0.50.18\n - Always follow plaintext header over the actual content type if its available (#3473) #3472\n - Bump github/codeql-action from 3 to 4 in the all group (#3468)\n - (Realtime updates) Update python-engineio requirement from ~=4.12.0 to ~=4.12.3 (#3467)\n - Bump psutil from 7.0.0 to 7.1.0 (#3469)\n\n - 0.50.17\n - Refactor content type detection, fixing more xpath issues for RSS types (#3465) #3462 #3391\n - Dependabot tweaks\n\n - 0.50.16\n - Fixing bad detection of text text/plain in previous release, adding automated test (#3460)\n\n - 0.50.15\n - Build - Fixing the multi platform container build test (repairs to cache) (#3455)\n - Filters - Adding "Strip ignored lines" in output option to filters (#3449)\n - Bump apprise from 1.9.4 to 1.9.5 (#3448)\n - Build - `linux/arm64` and `linux/arm64/v8` are the same, remove v8\n - Build - Pinning library versions to fix tests\n - Notifications - Upgrade Apprise 1.9.4 (#3443)\n - Process `text/*` non-HTML in their original format keeping line breaks, auto-detect attachments/downloads for text or HTML, WARNING - Will trigger false changes for some existing text file watches #3434 (#3435)\n - UI - Implementation of unread counter - adding test\n - UI - Re #3393 #3419 Implementation of unread counter tab along with realtime updates (#3433)\n\n - 0.50.14\n - Time interval field - Extra validation improvements and tests (#3432)\n - UI - Fixing HTML <title> versus custom title settings display in overview (#3430) #3429\n - API - Adding page title link, bumping docs (#3431)\n - "Time between check" field is now validated correctly (requires atleast one of the weeks days hours minutes seconds to be set)\n\n - 0.50.13\n - API - OpenAPI call validation was being skipped on docker based installs, misc API fixes (#3424)\n - Always extract page <title>, `{{watch_title}}` added to notification body tokens (#3415)\n - UI - Correctly set 'checking now' status badge on edit page\n - Add noindex meta (#3416)\n - Build - Bump actions/setup-python from 5 to 6 in the all group (#3408)\n - Restock - Add 'nicht mehr lieferbar' to stock status checks (#3410)\n\n - 0.50.12\n - Fix - Filters in tags/groups were being added to watches on each check - #3406 fix list update (#3407)\n - UI - Added "unread" view filter (#3393)\n - Enable "last_viewed" field in the watch API. (#3403)\n - Update docker-compose.yml - Include mac port info warning\n\n - 0.50.11\n - Bump cryptography from 43.0.1 to 44.0.1 (#3399)\n - Cryptography library - pinning version\n - UI - Improving "real-time updates offline" message\n - Build - Adding new cryptography library, solving apprise plugin issues (#3398) #3397\n - Update api-spec.yaml\n - API - API endpoint call validation against OpenAPI specification YML also (#3386)\n - API Docs - Improve descriptions\n - API Doc rebuild\n - Bump API Docs slightly\n - Update settings.html text\n - API - Use OpenAPI docs (#3384)\n - Refactor API Documentation (#3383)\n - Updating API documentation\n - Favicons in list - Prefer best/highest quality (#3351)\n\n - 0.50.10\n - API - Recheck by tag #3356 (#3378)\n - Cleanup empty queue messages Re #3376 (#3377)\n\n - 0.50.9\n - Bump actions/checkout from 4 to 5 in the all group (#3373)\n - Refactoring queue handling (#3363)\n - Build - rPi - Cryptography lib not needed (#3365)\n - Build - Bump actions/download-artifact from 4 to 5 in the all group (#3364)\n - Conditions & API - Fix set Conditions by API (#3349)\n\n - 0.50.8\n - Updated test with linuxserver alpine 3.22, include file/magic (#3345)\n - Ensure a default Locale is set for more reliable text decoding (en_US.UTF-8 by default) (#3340)\n - Re #3337 - UI - Various fixes for 'Extract Data' (#3341)\n - UI - Fixing UI - Favicons - Turning off favicons misaligns other icons on lister page #3321\n\n - 0.50.7\n - UI - Set default favicon, handle default 'not set' for new/updated installations\n - UI - Set default favicon, offer option to disable favicons (#3316)\n - README - Updating screenshot (with better cropping)\n - README - Updating screenshot\n - UI - Mobile CSS tweaks\n - UI - Mobile - Small tidyups for mobile use\n - UI - CSS - Modernising stylesheet build\n\n - 0.50.6\n - Favicon type detection - support for autodetecting mimetype for better reliability (#3308)\n - Fixing ARMv7 docker image support for older devices (#3311)\n - UI - Favicons - Try /favicon.ico if no other was specified in the document\n - UI - Favicons - Realtime mode - Fixing small bug when favicon needed updating in realtime\n - UI - Favicons in realtime update mode, update after favicon was written to disk only.\n - UI - Lazy load favicons so it doesnt block realtime and other operations\n - UI - Adding Favicon support to watch overview lister page + FavIcon API (#3196)\n - UI - Sort list by Running or Paused #3284 (#3294)\n - Similarity condition - Skip generating stats for very large documents in the 'Edit' page (#3296)\n - Refactor watch history/diff page time handling, fixing issue where the last time viewed was not set in the 'history' page automatically (#3293)\n - Update stock-not-in-stock.js Added 'backorder' and 'more on order'\n - Update README.md\n\n - 0.50.5\n - Update README-pip.md\n - Update README.md\n - Update README.md\n - Data save - Solving JSON DB saving bug (#3286 #3260 #3259)\n - Conditions - Fixing "Does NOT contain" condition (#3279 / #3272 )\n - Update README.md\n - Update LICENSE\n\n - 0.50.4\n - CVE-2025-52558 - Fixing XSS in error handling output of watch overview list\n - Better path cross-platform file handling (#3265)\n\n - 0.50.3\n - Realtime UI - Prefer websocket then fallback to 'polling' mode, increase reconnecting retries.\n - UI - Fixing Watch 'set viewed' by tag #3253 (#3258)\n - UI - Always unset 'unviewed' state when '[History]' button is pressed from watch overview list #3243\n - UI - Tweak UI option text description for 'Open history page in new tab' setting\n - UI/Application listening on IPv6 - Please use `-h ::` to listen on all IPv6 interfaces, `-p` is removed (#3257)\n - Realtime UI - Delete watch should update in realtime ( #3255 )\n - UI - Quick watch add form color fix\n - Application via HTTPS support - Adding SSL setup and automated test (#3247) (#3252)\n - Browser Steps - Fix for `source:` URLs fix (#3254)\n - UI - Restyle of "quick watch add form" above watchlist\n - UI - Don't restrict page content box to 80% width (#3251)\n - UI - #3236 fix duplicate icon in watchlist\n - Data store - use original formatted data write\n - Realtime UI - Ability to notify browser/client if there was a notification event (#3235)\n - UI - Realtime - Add realtime warning to page if server goes offline\n - Browser Steps - Better support for sites that redirect on click/login etc\n - Restock detector - Update texts (#3234)\n - Puppeteer fetcher - Issue a Page.sendStop on frame load incase the browser is waiting for other data (#3232)\n - Build test - Build test for platforms in parallel (#3229)\n - BrowserSteps - remove unsupported exception class\n\n - 0.50.2\n - 0.50.1\n\n\n - 0.50.01\n - UI - Adding missing icons lib\n - Use pip build cache from inside Dockerfile (#3228)\n - UI - Also uncheck 'check all' checkbox for group operations in realtime mode\n - UI - Real time - checkbox operations now realtime without reload\n - UI - Revert icon changes\n - Building - Use GHA layer caching (#3227)\n - UI - Realtime - Fixing 'last_changed' status re #3224\n - Realtime UI - Socketio tweaks and refactor (#3220)\n - Code - Fix dep warning (#3221)\n - Realtime UI - Reducing log output\n - UI - Reword restock detector plugin description\n - UI - Remove incorrect error text\n\n - 0.49.18\n - Realtime UI updates via WebSocket (#3183)\n - Update to Apprise 1.9.3 - BlueSky, Resend support (#3216)\n - UI - Update 'Browser Steps' UI text\n - Code - Remove unused f-strings (#3209)\n - Use logger.debug for playwright console logs (#3201)\n\n - 0.49.17\n - Resolve warnings of bs4 library (#3187)\n - Revert memory strategy change for html_to_text (Was hanging under high concurrency setups)\n\n - 0.49.16\n - Fixes to ensure proxy errors are handled correctly (#3168)\n - UI - Custom headers should have validation (#3172)\n - Update selenium library (#3170)\n - Restock detection - adding new string\n - Conditions - Levenshtein text similarity plugin - adding test, fixing import, fixing check for watches with 1 snapshot history (#3161)\n - Restock detection - Use cleaner logic for limiting elements to scan, refactor, improve tests (#3158)\n - pyppeteer fast puppeteer fetch - be sure viewport is set to --window-size if --window-size is set (#3157)\n - Improved global ignore test (#3140)\n - Update docker-compose.yml (#3149)\n - Small fix for xpath element scraper (#3145)\n - Plugins for conditions (and include Similarity / Levenshtein, wordcount conditions) Re #3108\n - Browser Steps - <Select> by Option Text - #1224, #1228 (#3138)\n - Browser Steps - error reporting and session shutdown improvements (#3137)\n\n - 0.49.15\n - Visual Selector & Browser Steps - Always recheck if the data/screenshot is ready under "Visual Selector" tab after using Browser Steps (#3130)\n - App logs - Send TRACE and INFO logs to stdout (#3051)\n - Development: introduce Ruff as linter/formatter (#3039)\n - Updating restock texts (#3124)\n - Only add screenshot warning if capture was greater than trim size (#3123)\n\n - 0.49.14\n - Small fix for multiprocessing start on Mac OS (#3121 #3115)\n - docs: Update reference URL (#3119)\n - UI - Fix to edit and groups template\n - Updating API documentation\n - Undo forced selenium headless mode, small refactor (#3112)\n - Playwright + Puppeteer fix for when page is taller than viewport but less than screenshot step_size (#3113)\n - Memory management - Run HTML to text in sub process, a few more cleanups to playwright (#3110)\n - UI Edit/Stats - Add levenshtein distance info, explains how "different" the last two snapshot are (#3109)\n\n - 0.49.13\n - API - Added notifications API endpoints (#3103)\n - Fetcher - Use bigger screenshot chunks to speed up page screenshot (#3107)\n - App memory - Apprise import only when needed - saves ~50Mb RAM if you dont have any notifications enabled (#3106)\n - Fetching - Small improvement memory handling in detecting price information (saves ~10Mb)\n - Refactor image saving with forked process to reduce memory usage, improvements to xpath scraper handling (#3099)\n - Update other methods to use updated screenshot handler (#3098)\n - Memory fixes for large playwright screenshots (#3092)\n - Filters - Support multi line regex (#2889)\n - UI - Add UI options tab and setting to disable opening diff in a new tab (#3071)\n - README.md update - Including blurb about 'conditions'\n - Requests fetcher - Remove old screenshot when watch was in a different fetcher type (#3097)\n - Make chrome browser headless when checking the site with selenium (#3095)\n - UI - Field name update - Keyword triggers - Trigger/wait for text (#3088)\n - UI - "Recheck all" should also queue most overdue first (same like automatic scheduler) (#3087)\n - Groups - Including "Extract text", "Text to ignore", "Trigger text" and "Text that should not be present" filters\n\n - 0.49.12\n\n - 0.49.11\n\n - 0.49.10\n - Update README.md\n - UI - "Conditions" section, making the Conditions setup table work better on mobile/responsive\n - Adding a GC memory cleanup (releases cached libxml memory and others) (#3079)\n - Python 3.11 container base (#3077)\n - Use lowercase static asset filenames\n - Restock detection - Add Indonesian phrases for out-of-stock detection (#3075)\n - Regession - Shared history/diff page with anonymous access turned on should allow screenshot access (#3076)\n - Update edit.html - linking to tutorial\n - Code - Tidy up lint errors (#3074)\n - UI - Update edit.html- xPath support text for 1 & 2\n - Text/fetching - Small fix for when last fetched was zero bytes and special options (removals/additions/changes) was set (#3065)\n - Notifications backend - Refactor + tests for Apprise custom integration (#3057)\n - UI - Watch edit - "Clone" Should be "Clone & Edit" without watch history, redirect to the new edit page (#3063 #2782)\n - UI - Conditions - Offer some information about what the filter/condition/trigger saw (#3062)\n - UI - Tidy up support links\n - UI - Set a graph % of ETA time completed of checking the watch (#3060)\n\n - 0.49.9\n - RSS Fixes and improvements - Ability to set "RSS Color HTML Format" in Settings, detect and filter content with bad content that could break RSS (#3055)\n\n - 0.49.8\n - Server - Path blueprint fixes and moving code blueprint to fix RSS forward slash on url (#3054)\n - API - Adding "Search" API (#3052)\n - Fetching - Upgrading to pyppeteer-ng 2.0.0rc8 (more modern pyee requirements)\n\n - 0.49.7\n - Adding Tags/Groups API (#3049)\n\n - 0.49.6\n - API Access should still work even when UI Password is enabled (#3046) #3045\n\n - 0.49.5\n - Template tidyup & UI Fixes (#3044)\n - Watch history - Ensure atomic/safe history data disk writes (#3042 #3041)\n - Testing - Replace Linux only 'resource' library with cross-platform 'psutil' library (#3037)\n - Refactor code layout, add extra tests\n - New major functionality CONDITIONS - Compare values, check numbers within range, etc\n\n - 0.49.4\n - Datastore - Always use utf-8 encoding for error text output storage\n - Restock detection - Adding french keywords for out of stock items\n - Browser Steps - Should use the Watch URL/link after any Jinja2 type templates are applied\n - BrowserSteps - Speed up scraping, refactor screenshot handling for very long pages (#2999)\n - Browser Steps - Added new "Make all child elements visible" action\n - Browser Steps - Added new "Remove elements" action\n - UI - Browser Steps - "Click X,Y" should focus on the input field also\n - UI - Browser Steps - Improving Browser Steps usability on mobile\n\n - 0.49.3\n - UI - Reverting JS change to tabs (the better fix was the W3C HTML validation)\n\n - 0.49.2\n - UI - Make the setup and error messages for Visual Selector and Browser Steps a lot more meaningful (#2977)\n - Update docker-compose.yml\n - UI - More W3C HTML validation fixes\n - UI - More W3C validation fixes (#2973)\n - UI - Tweaks for HTML validation\n - Filter - "Unique lines" could possibly crash if history was empty or cleared on the disk\n - UI - Sometimes the DOM wasnt ready when tab selection triggered via CSS, which displayed empty tabs on some browsers\n - Removing deprecated docker-compose.yml version attribute (#2967)\n - Update settings.html\n - Browser Steps - Increasing timeout for actions and unifying timeout values\n - Browser Steps - Fixing 'Uncheck checkbox' #2958\n - UI - "Browser Steps" tab should be always available with helpful info (evenwhen playwright is not configured) (#2955)\n - Adding `browser_steps` JSON Schema rule for API updates (#2957)\n - UI - Fix mute/unmute alt/title label alt/title text in watch overview (#2951)\n\n - 0.49.1\n - Update stock-not-in-stock.js - Italian (#2948)\n - Re #2945 - Handle/Strip UTF-8 ByteOrderMark in JSON strings correctly (fixes `"Exception: No parsable JSON found in this document" ` error) (#2947)\n - Add major and minor tags for Docker release workflow (#2938)\n - Adding jinja2/browsersteps test (#2915)\n - Header handling - Fix header parsing to split on the first colon only (headers where the value contained :// type may have been broken) (#2929)\n\n - 0.49.00\n - Update README.md\n - Build/Libraries - Pin `referencing` library which breaks due to out-dated flask_expects_json, remove pip upgrade in test(#2912)\n - Notifications - Custom POST:// GET:// etc endpoints - returning 204 and other 20x responses are OK (don't show an error was detected)(#2897)\n\n - 0.48.06\n - Restock - Add test for new lower/higher price notification Re #2715 (#2892)\n - Update integration test for "linuxserver" test build (#2891)\n - Notifications - Update Apprise to 1.9.2 - Fixes custom posts:// gets:// etc URL's being double-encoded, fixes chantify:// notifications (#2868) (#2875) (#2870)\n - Custom posts:// get:// notifications etc - Be sure our custom extensions are imported (#2890)\n - "Send test notification" button - Easier to understand test send results, Improved error handling, code refactor (#2888)\n - Improve `last_checked` vs `last_changed` time information precision (#2883)\n - Update Apprise to 1.9.1 (#2876)\n - Builder/Docker - Remove PUID and PGID ( they were not used ) (#2852)\n - UI - Fix diff not starting from last viewed snapshot (#2744) (#2856)\n\n - 0.48.05\n - Fixing test for CVE-2024-56509 (#2864)\n - CVE-2024-56509 - Stricter file protocol checking pre-check ( Improper Input Validation Leading to LFR/Path Traversal when fetching file:.. )\n\n - 0.48.04\n - Windows was sometimes missing timezone data (#2845 #2826)\n\n - 0.48.03\n - 0.48.02\n - 0.48.02\n - Notifications - "Send test" was not always following "System default notification format" (#2844)\n - Notifications - "Send test" was not always following "System default notification format"\n\n - 0.48.02\n - Notifications - "Send test" was not always following "System default notification format"\n - Notifications - Default notification format (for new installs) now "HTML color" (#2843)\n - Notification - `HTML Color` format notification colors should be same as UI, `{{diff_full}}` token should also get HTML colors ( #2842 #2554 )\n - Notifcations - Adding "HTML Color" notification format option (#2837)\n - UI - Make 'tag' sticky - redirect to current tag on edit or add watch (#2824 #2785)\n - Notifications - Support for commented out notification URLs (#2825 #2769)\n - Docs - Adding information to README.md about the new scheduler\n\n - 0.48.01\n - UI - Fixing scheduler options\n\n - 0.48.00\n - Fix HIDE_REFERER env option for hiding changedetection.io from referer headers (#2787)\n - New functionality - Time (weekday + time) scheduler / duration (#2802)\n - Add Turkish phrases for out-of-stock detection (#2809)\n - UI - Always use UTC timezone for storing data, show local timezone (#2799)\n - Update stock-not-in-stock.js\n - Python 3.13 compatibility (#2791)\n - Code - Update .gitignore and .dockerignore (#2797)\n - VisualSelector - Use 'deflate' for storing elements.json, 90% file size reduction (#2794)\n - UI - Show local timezone info in settings (for future functionality) #2793\n - Notification - Locking paho-mqtt:// version fix\n - Update COMMERCIAL_LICENCE.md\n - Ability to disable version check (set `DISABLE_VERSION_CHECK=true`) Re #2773 (#2775)\n - Minor improvement for queue management\n - Update bug_report.md\n\n - Security - Fix test\n - Security check - improve test\n - 0.47.06\n - CVE-2024-51998 - file:/ path traversal access should not be allowed to access a file without ALLOW_FILE_URI set\n - Update docker-compose.yml (#2767)\n - Price tracker - fix for sites that supply an empty additional price (#2758)\n - Testing - Pinning werkzeug (#2757)\n\n - 0.47.05\n - CVE-2024-51483 - Fix for limiting access to file:// via source:file:///tmp/file.txt when using webdriver/playwright\n - Backups - Hide incomplete/running backups from being downloaded\n - Backups - Backups now operate in the background, provide a nice UI to access/download previous backups (#2755)\n - Filters - Process all CSS and XPath 'subtract' selectors in a single pass to prevent index shifting and reference loss during DOM manipulation. (#2754)\n\n - 0.47.04\n - Do not recheck 'paused' watches on edit/save (Re #2747 #2750)\n - Notification post:// get:// etc - Fixing URL encoding of headers so that '+' in URL is correctly parsed as ' ' (and other url-encodings) (#2745)\n - #2502 - Add jinja2 template handling to request body and headers (#2740)\n - Restock detection - Add additional out-of-stock detection for PT language (#2738)\n - "Send test notification" in "Restock" mode was not working correclty when restock tokens "{{restock.price}}" were in the notification body (#2737)\n - #2727 Notifications - Fix "send test notification" on empty list, includes test (#2731)\n - UI - Fix mobile styling inconsistencies and resolve diff page overflow issue (#2716)\n - Filters - "Block change detection when text exists" should not trigger a change when the original text returns\n - UI - More work on tab buttons hiding behind menu/header :-)\n\n - 0.47.03\n - Remove same checksum skip check - saved a little CPU but added a lot of complexity (#2700)\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.02\n - UI - Fix scroll offset / tab buttons hiding behind menu/header\n\n - 0.47.01\n - Adding missing `apprise_plugin` for pypi/pip based installs\n\n - 0.47.00\n - Restock multiprice improvements (#2698)\n - Test - Simple test for live preview\n - Adding test for proxy checker/scanner (#2697)\n - Fixing proxy checker (#2696)\n - UTF-8 handling fixes, Improvements to whitespace filtering (#2691)\n - Testing - Tidyup (#2693)\n - Filters & Text - Preview refactor/improvements (#2689)\n - Build - Add image source label to Dockerfile (Better Renovate and others support) (#2690)\n - Custom JSON/POST Notifications - Log when it could not apply the application/json content-type header\n - UI - Filters live preview - improvements to layout\n - Restock - Use the scraped 'Not in stock' product status over the metadata version (many website lie in the metadata) (#2684)\n - UI - Better 40x error message (#2685)\n - Visual Selector - Including <button> (#2686)\n - Stock/not-in-stock scraper - slight reliability improvement (#2687)\n - Code - Small improvements in logging\n - UI - CSS - Fix on sorting row wrapping issue (#2680)\n - UI - Live filters preview - Better handling of watch preferences\n - UI - "Diff" button in overview list is now "History" button (#2679)\n - UI - Improve error handling when a module is missing when editing a URL/link (#2678)\n - UI - Live filters preview - Make it sticky in the viewport so its easier to build nice filters\n - UI - Live filters preview - dark mode improvements\n - UI - Improvements to text preview on mobile\n - UI - Improvements to live preview of Filters text\n - UI - Misc fixes for mobile styling (#2669)\n - Update docker-compose.yml - Adding example for enabling change detection on local files\n - UI - Live preview - misc improvements (Adding test, fixes to filters) (#2663)\n - UI - "Filters & Triggers" - Live preview of text filters (Preview the output of the filters section in realtime) (#2612)\n - Reversing subprocess execution - saved a little memory but used a LOT more CPU (#2659)\n - [test] Use local data instead of reaching out to changedetection when testing (#2660)\n - Restock monitor - Only try to process restock information (like scraping for "out of stock" keywords) if the page was actually rendered correctly. (#2645)\n - Text filters - Adding filters "Trim whitespace" and "Remove duplicate lines"\n - Browser Steps - UI - Use a better flexbox layout\n - Filters - Add support for also removing HTML elements using XPath selectors (#2632)\n - Update AppRise notification library to 1.9.0 (#2624)\n - browser_steps: add "click element containing text if exists" (#2629)\n - Testing - Fixing Restock test #2641\n - Testing - Fix false filter missing check alerts\n - Restock/Price detection - Fix duplicated prices with different data type on single page product #2636 (#2638)\n - Memory management improvements - LXML and other libraries can leak allocation, wrap in a sub-process (#2626)\n - Small memory allocation fixes (#2625)\n - Testing - locale fix for test (#2623)\n - Testing/Code - Improving test reliability (#2617)\n - UI - Hiding noisy info under 'show advanced help' button (#2609)\n\n - 0.46.04\n - Fixing restock monitor tests and tweaking docker default config example,\n - Container name should be 'sockpuppetbrowser' because its not just playwright that uses it\n - Restock/Price detection - Better catching of errors when parsing metadata documents for restock/price check (#2602)\n - Restock - updating texts and text offsets\n - Build - Unpin jsonschema for faster builds (#2583)\n - Price detection/scraping - Adding extra element training data (#2582)\n\n - 0.46.03\n - Watch 'Download last snapshot' link/button should give last, not first snapshot (#2576)\n - Price and restock scraping - small price fix scraper (#2575)\n - Browser Steps UI - Interactive UI wasn't sending headers but was when the check ran (#2551)\n - Set encoding type for scraper script reader (#2574 #2568)\n - Handle zero-byte/empty content responses with "`[ ] Empty pages are a change`" option, the same as when the HTML doesnt render any useful text (#2530)\n\n - 0.46.02\n - Adding test for #1995 UTF-8 encoding in POST request body and post:// notifications (#2525)\n - Updating Apprise notification library , Splunk/VictorOps, Africas Talking, Microsoft Power Automate / Workflows, Soci\u00e9t\u00e9 Fran\u00e7aise du Radiot\u00e9l\u00e9phone (SFR) Support (#2524)\n - Encode POST style requests and notifications as UTF-8 if it has no encoding/basic string (#2523)\n - VisualSelector+BrowserSteps - When scraping elements, check for null results (#2517)\n - Use #!/usr/bin/env to support virtualenv (#2518)\n - Update README.md\n - UI - Adding "Download latest HTML snapshot" from Edit Watch > Stats page for easier debugging (#2513)\n\n - 0.46.01\n - UI - Fixing up 'test notification' bug from main settings and tag settings pages #2510 (#2511)\n\n - 0.46.00\n - Restock/Price detection - Improving text information snapshot value\n - Restock - Tweaking storage of "original price"\n - Fixing file:// file pickup - for change detection of local files (#2505)\n - Adding Apple M1 Pro type arm64/v8 support docker image (#2507)\n - Dropping older ARM v6 support due to dependencies not having support (#2506)\n - Ability to use restock and price amounts in notifications as tokens (for example {{restock.price}} ) (#2503)\n - Restock & Price detection - Ability to set up a tag/group that applies to all watches with price + restock limits\n - Fixing problematic tag assigning via UI which caused watches to not accept new settings\n - Fixing first history/preview save issue (First version after an error, on the first check, wasnt available) (#2494)\n - UI - Restock/price following text cleanups\n - UI - Extract <title> as title should work on all processors (#2490)\n - Restock & Price monitor - Huge refactor, set upper and lower price alert limits, set % change, follow the prices and restock amounts directly in the watch-overview list\n - Product checks - Just a basic string check is far more efficient for suggestion price/restock check plugin (#2488)\n - Update COMMERCIAL_LICENCE.md\n - Update README.md - Adding link to COMMERCIAL_LICENCE.md for those interested in reselling the software\n - Adding COMMERCIAL_LICENCE.md\n - Testing - Adding simple memory usage test (#2483)\n - Bugfix - Watches with BrowserSteps should recreate the data-dir if it was missing (in the case that you deleted/migrated) (#2484)\n\n - 0.45.26\n - Code - Fixing deprecation warning (#2477)\n - UI - Visual Selector should still update when elements were not found (#2476)\n - Code - Update/modernise diff.py (#2471)\n - UI - Visual Selector - Multiple selections (refactor) (#2475)\n - UI - Visual Selector now supports Shift+Click for multiple selections!\n - UI - Visual Selector - Show/visualise all/any matching filter elements from all filters in "CSS/JSONPath/JQ/XPath Filters" include filters (#2440)\n - UI - Visual Selector graphics should be centred\n - Snapshot count from history was not updated in watch after using [clear history] (#2459)\n - Fixing 'tags'' field from old installs (0.43.0+) could have wrong data-type causing crash\n\n - 0.45.25\n - UI - Fixing preview/diff "ignore text" highlight button (refactor, didnt work in "preview" mode) (#2455)\n - Restock detection - Updating detection texts\n - UI - Mobile - Hiding empty columns\n - UI - Mobile - Watch overview table - Sort/order buttons were not being shown correctly\n - Update docker-compose.yml - fix indentation re #2447\n - Restock detection - Added extra out-of-stock phrases for DE (#2442)\n - Restock detection - updating texts\n - UI - Fixing double punctuation in 'unpaused' message #2435\n - Build - Bump docker/build-push-action from 5 to 6 in the all group (#2436)\n - Now saving last two HTML snapshots for future reference, refactor, dont write screenshots and xpath to disk when no change detected (saves disk IO) (#2431)\n - Filters - Implement jqraw: filter (use this to output nicer JSON format when selecting/filtering by JSON) (#2430)\n - Build - fixing build warnings\n - Upgrade to Python 3.11 from 3.10, add faster prebuilt "wheels" for rPi devices, upgrade cryptography security library\n - Prefer pythons built in "importlib" over pkg_resources+setuptools (#2424)\n - Security/dependabot - Bump urllib3 from 1.26.18 to 1.26.19 (#2423)\n\n - 0.45.24\n - Update eventlet ( Fixes SSL error on Python 3.12 ) (#2419)\n - Filter failure/not found notification threshold - Counter should be reset when editing a watch, clear watch errors on 'save' (#2413)\n - Bump dnspython from 2.3.0 to 2.6.1 (#2306)\n - Improve testing for Python 3.10, 3.11 and 3.12\n - UI - Add space around checkbox operation buttons so they work better in mobile #2393\n - RSS - Setting to hide muted watches in RSS feed (default ON) (#2411)\n - Fetching/Requests - Fixing user agent header overrides per-watch of global settings (#2409)\n - Code - improving unique key fix for history database handler (#2402)\n - UI - 'Mark all viewed' button should not show when all viewed (#2399)\n - Fixing build test - Adding small delay (#2397)\n - Code - Bump eventlet from 0.33.3 to 0.35.2 (#2305)\n - UI - Mobile CSS/layout fix wrapping on empty list text #2393\n - UI - Preview single snapshot - Date and button fixes (#2389)\n - Build - PIL/pillow package not used, probably shouldnt be installed/required (#2382)\n\n - 0.45.23\n - RSS - Only insert feed header if app_rss_token is set (should be only shown in index/overview page) (#2381)\n - Fetcher - Using pyppeteerstealth with puppeteer fetcher (#2203)\n - Fix overflowing text\n - RSS and tags/groups - Fixes use active_tag_uuid, fixes broken RSS link in page html (#2379)\n - Ability to set default User-Agent for either fetching types directly in the UI (#2375)\n - Testing - Fixing JSON test\n - UI - Mobile - quick watch form element fixes\n - UI - CSS - Remove gradient border, it did not add much to the design #2377\n - RSS - Muted watches should not show in RSS feed (#2374 #2304)\n - Notifications - Fixing truncated notifications when tgram:// or discord:// is used with other notification methods (#2372 #2299)\n - UI - Ability to preview/view single changes by timestamp using keyboard or select box(#1916)\n - Browser Steps - Fixing "goto site" step #2330 #2337 (#2364)\n - Crash on older CPU - Setting LXML version to any version without the known modern-CPU-only CPU flags (#2365 #2328 )\n - Notifications - Update Apprise notification library to 1.8.0 (#2363 #2324) fixes mailto:// with IP as server endpoint\n - UI - Refactor of the Recheck Time Settings, Added "Use default recheck time" checkbox and refactor/simplify system handling (#2362)\n - UI - Search should scan/search error messages (#2353)\n - UI - 'stats' tab should show what the server-type detected is ( #2348 )\n - Update README.md\n - Notifications - Setting set minimum version for mqtt:// library notifications (#2334 / #2333)\n\n - 0.45.22\n\n - 0.45.21\n - UI - Wrap tag names in solid background to make it easier to read when theres multiple tags\n - UI - Error text on exception should contain the word Exception (#2322)\n\n - 0.45.20\n - Bug fix - further work on lxml filter extract (#2313 #2312 #2317)\n\n - 0.45.19\n - Bug fix for newer lxml module - module 'lxml.etree' has no attribute '_ElementStringResult' - reimplement _ElementStringResult (#2313 #2312)\n\n - 0.45.18\n - UI - Adding UI notice if watch has group options set (#2311 #2307)\n - dependabot - automatically follow apprise\n - "Send Test Notification" - In "Group" settings form it should not fallback to the system wide notifications when sending a test if nothing is set.\n - "Send Test Notification" - Now provides better feedback and works with the actual values in system settings form\n - Code - Getting ready for newer python versions - packing our own strtobool (#2291)\n - UI - BrowserSteps - Show step screenshot/pic should use absolute URL #2243\n - UI - Remove unique check for URLs entered on the "quick watch add" form ( #2286 #2292 )\n - UI - Improvements to tag/groups page, show number of watches under each group, link group name to list (#2290)\n - "Send Test Notification" button from watch form edit should respect global settings and tag/group settings ( #2289, #2263 )\n\n - 0.45.17\n - UI - Add helper note\n - UI Text - Adding helper text to VisualSelector to explain what the connection is with the CSS/xPath filters\n - Update contributing documentation for discontinuation of `dev` branch (#2272)\n - Updating pyppeteer-ng (mainly newer pillow release) (#2247)\n - Notifications - Updating apprise version, pinning mqtt:// to compatible version (#2242)\n\n - 0.45.16\n - Pip build - content fetchers package was missing\n\n - 0.45.15\n - Updating restock detection texts\n - Adding CORS module - Solves Chrome extension API connectivity (#2236)\n - UI - Overview list shortcut button - Ability to reset any previous errors\n - Chrome Extension - Adding link and install information from the API page\n - Chrome Extension - Adding link in README.md to the webstore\n - Chrome Extension - Adding callout to UI\n - Import - Fixed "Include filters" option (fixed typo on select) (#2232)\n - Updating restock detection texts\n - Restock detection - Improving test for restock IN STOCK -> OUT OF STOCK (#2219)\n - Puppeteer - remove debug hook\n - Custom headers fix in Browser Steps and Playwright/Puppeteer fetchers ( #2197 )\n - text_json_diff/fix: Keep an order of filter and remove duplicated filters. 2 (#2178)\n - Fetching - restock detecting and visual selector scraper - Fixes scraping of elements that are not visible\n - BrowserSteps UI - Avoid selecting very large elements that are likely to be the page wrapper\n - Fetching - Puppeteer - Adding more debug/diagnostic information\n - Update stock-not-in-stock.js\n - UI - Sorted alphabetical tag list and list of tags in groups setting (#2205)\n - Code - Remove whitespaces in visual selector elements config\n - Build fix - Pinning package versions and Custom browser endpoints should not have a proxy set (#2204)\n - Update stock-not-in-stock.js\n - Fetching pages - Custom browser endpoints should not have default proxy info added\n - Puppeteer - fixing wait times\n - Puppeteer - more improvements to proxy and authentication\n - Puppeteer - client fixes for proxy and caching (#2181)\n - dependabot - Bump the all group with 1 update (artifact store) (#2180)\n - Puppeteer fetch - fixing exception names\n - Code - Split content fetcher code up (playwright, puppeteer and requests), fix puppeteer direct chrome support (#2169)\n - Alpine linux build - adding JPEG development headers to fix build errors\n - Plawright content fetcher - Fixes for status codes and screenshot info (#2168)\n - Fetching - Prefer to use SockPuppetBrowser (#2163)\n\n - 0.45.14\n - Bug fix - fix missing default var (#2162/ #2118/ #2122 )\n - Fix - Pinning elementpath xPath filter library to 4.1.5 (#2164)\n - Restock detection - Update stock-not-in-stock.js (NL)\n - New text filter - Sort text alphabetically filter (#2153)\n - Filtering - include_filters in group and watch settings should not duplicate (#2151 #1845)\n - Record notification count and show in [stats] tab (#2150)\n - Restock - Update stock-not-in-stock.js Italian translation (#2149)\n - UI - Show error/warning when trying to compare the same version\n - Fetching - Make an obvious error when using BrowserSteps with the simple text fetcher (#2145)\n - Fix for switching to price-data-follower mode (when page has JSON price data), only needs to be queued once. Re #1565\n - Fetching - Always record `server` software reply headers (will be used in the future) (#2143)\n - Testing - General test workflow improvements (#2144)\n - RSS - Include link to the watched URL in the feed (#2139 #2131 and #327)\n - Notifications - skip empty notification URLs from being processed (#2138)\n - UI - Filters & Triggers - Adding example for keyword matching in a line\n - RSS - Adding performance stats\n - Notification - logging - adding performance information for processing time of notifications #327\n - UI - Adding icon to show which watch has Browser Steps enabled (#2137)\n - Logging - Adding extra debug logging to change detection (#2136)\n - Fetcher - Improve status_code logging (#2130 #2122)\n - Notifications - Bugfix: Notification format not being set correct (HTML emails being sent as plaintext and other problems) (#2129)\n - Restock tweaks - use a single regex, tidy up height detection (#2125)\n - Notification - Templates - Adding an example of how to use URL encoding with tokens\n - Notification - Templates - Adding an example of how to use |tojson for JSON payloads\n - Build maintenance - dependabot - Bump the all build helpers (#2121)\n - Enable dependabot for github-actions (#2119)\n - Update docker-compose.yml\n\n - 0.45.13\n - Security update - Adding API token secure check for API endpoint `/api/v1/watch/<uuid>/history` @rozpuszczalny\n - Test - tidy up backup test (#2117)\n - Adding contributors section (#2116)\n - Logging loguru output tweaks (#2112)\n - Support Loguru as a logger (#2036)\n - Update stock-not-in-stock.js texts\n - Test - Adding extra test for HTML output in emails ( #2103 )\n - Update README.md\n - Restock detection - Check all elements for text to get stock status from, only consider elements inside the viewport, only consider elements more than 100px from the top (avoid menu) , trim any text returned (#2040)\n - Notifications - When any in a list of notifications fails, the others should still work (#2106)\n - Browser Steps - Fixing "'Response' object is not subscriptable" where quotes were used in connection URL - Quote wrapped URL for browserstep url was breaking the connection #1627 #1823 #2099 (#2100)\n - Added OPTIONS HTTP method (#2094)\n - API Docs - Examples should use port 5000 (same as the docker-compose default installation and other documentation)\n\n - 0.45.12\n - 0.45.11\n - Notification fixes - error on mailto:// when no format was specified, fixing default body and title of notifications to respect global settings (#2085)\n - Update README.md\n - Removing heroku support as its no longer free\n - PyPi package build fixes (#2084)\n - Adding PyPi pip package publisher script\n\n - 0.45.10\n - Update README.md - Remove deprecated docker-compose (now docker compose)\n - Browser Steps - General error handling improvements (#2083)\n - Browser Steps - Fix for correct tokens/information in browser step failure notification (#2066)\n - UI - [Send test notification] - Refactor to use all tokens like a real watch and Notification Body+Title from UI value (#2079)\n - Notifications upgrade - Upgrade to Apprise 1.7.1 - Emojis support, Telegram topics support, Discord support for user and role @ping support. (#2075)\n - Restock detection - "In stock" should be None/"Not yet checked" by default (#2069)\n - Restock detection - updating texts\n - Fetching - Custom browser on experimental/puppeteer fetcher - Don't switch to custom puppeteer mode if external browser URL is active (#2068)\n\n - 0.45.9\n - Restock detection - Update stock-not-in-stock.js strings (Dutch translations)\n - Testing: Improve application signal handling test coverage (#2052)\n - Update docker-compose.yml\n - Restock detection - Update stock-not-in-stock.js strings (#2032)\n - API - Updating documentation\n - Update README.md\n - API - Ability to add/import bulk list of watches as a line-feed separated list (#2021)\n - Notifications - Fixing support for headers in custom post://, posts:// notifications, ability to include HTTP headers when making custom notifications (#2018)\n - Improve handling of SIGTERM shutdown in containers, remove unnecessary multi-process handler for pip installs, tidy up modules (#2014)\n - UI - Extra Browsers - Adding links and more resources on how to connect a fingerprint/scraping browser\n\n - 0.45.8.1\n - PDF Fetcher for change detection - Always use plain requests for PDF because otherwise we cant access the embed PDF in the browser (#2020)\n - UI - Fix - Edit Watch 'Show advanced options' should fire at page load to show you whats possible\n\n - 0.45.8\n - Restock detector - adding more detection strings\n - UI - remove incorrect label\n - UI - "Add new watch" URL at main input box should always grow to match the viewport\n - UI - Tidy-up for advanced settings under watch edit, HTML validation fixes (#2011)\n - UI - 'Request body' section disappears after switching from 'Playwright' to 'System settings default' and back on 'Request' tab - Fixed #1449\n - Browser Steps - Adding validation for "Click X,Y" step\n - API - Make sure the watch "is viewed" attribute is correctly represented in the API output (#2009)\n - Update playwright fetcher library and API calls\n - Testing - Improve PDF text change detection tests (#1992)\n - UI - Clicking the "[Diff]" link should take you to the difference starting at the relative time to when you last viewed the difference page (#1989)\n - Visual Selector - xPath handling misc fixes (#1976)\n - Fix build issue\n - feature: Support XPath2.0 to 3.1 (#1774)\n - New functionanlity - Selectable browser / ability to add extra browser connections (good for using "scraping browsers"/ etc) (#1943)\n - API/UI - Button to regenerate API key (#1975 / #1967)\n - Code refactor for fetchers (#1941)\n\n - 0.45.7.3\n - Build - update docker container cache setup\n\n - 0.45.7.2\n - UI - Cleanup fonts better display in firefox, request CSS according to version (#1968)\n - Revert "Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)" (#1964)\n\n - 0.45.7.1\n - Build: python libraries - pinning more libraries (#1962)\n - Build: python libraries - eventlet + dnspython dep problems were fixed (#1963)\n - Pip builder - ignore proxy test data if it exists\n\n - 0.45.7\n - UI - Fixing issue where search box JS interfered with page render when logged out\n\n - 0.45.6\n - UI - Adding support-us widget <3 (#1956)\n - Visual Selector - Small fix, Improving elements fetcher reliability (#1947)\n - Update README.md - Adding import information\n - Upgrade playwright browser library (#1942)\n - Update docker-compose.yml - playwright version should be the same as in the automated tests\n - Import - Improved Wachete Excel XLS import support for "dynamic wachet" (sets correct state of using chrome browser or not) column (#1934)\n - Refactor Excel / wachete import, extend tests (#1931)\n - Build - Upgrading pip packages (#1915)\n - Ability to Import from Wachete XLSX (or any XLSX) - Wachete alternative made easy (#1921)\n - Docker build - upgrade image to "bookworm" debian version - fix glibc mismatch (#1918)\n - Fetcher - experimental puppeteer fetch - dont rewrite the proxy protocol (fixes socks5 bug)\n - Nice format stats (comma sep)\n - Selenium fetcher - Test was on `4.14.1` but documentation was not, change both to `4` (#1912)\n\n - 0.45.5\n - BrowserSteps - Wrong text taken from browser steps (#1911)\n\n - 0.45.4\n - Code cleanup - Browser Steps\n - Fetching - Browser Step enabled watches should also identify 404/non-200 status situations (#1907)\n - Text Filters - "Extract Text" filter was not being error checked properly when using a RegEx (#1902)\n - Fetching/BrowserSteps - Going to a page was using slightly logic to the main way - make them use the same methods (#1890)\n - UI - "With errors" tag/button should always show the current tag error count\n - Build - Add piwheels support for ARMv6 and ARMv7 machines (rPi etc) (#1814)\n - Upgrade selenium to 4.14.0 (latest) (#1783)\n - UI - Don't show search icon when logged out (#1896)\n - UI - Adding handy "limit to watches with errors" button (#1886)\n - UI - Viewing text differences - Tweaks to "Jump to next change" button\n - UI - BrowserSteps - Show the screenshot of an error if it happened on a step, highlight which step had the error to make it easier to find out why the step didnt work, minor fixes to timeouts(#1883)\n - UI - Visual Selector should be the same page-size as Browser Steps (fit inside the browser viewport)\n - Packaging - Enable jq query for filters package installation for darwin (mac) #1868\n - UI - Adding [stats] tab to watch Edit page (#1880)\n - Bugfix - [Clear history] button was not clearing all metadata (#1881)\n - RSS fetch - RSS field <title> was not rendering as text correctly, added workaround #1879\n - PDF Fetching - Handle when the PDF is given as inline content without a proper mime header (#1875)\n - Notification library - Bump Apprise notification library to 1.6.0 (#1867)\n - RSS Fetching - Handle CDATA (commented out text) in RSS correctly, generally handle RSS better (#1866)\n - UI - Adding mouseover/title to show absolute date/time of a last-change or last-checked date #1860\n - UI - Difference text viewer - fixing jump to new difference on changing word/line/etc style\n - Testing - Improve xPath tests (#1863)\n - UI - Fixing jump to next difference button after refactor\n - UI - Updating proxy tip link\n - UI - Adding watch label/title to [edit] page title (#1858)\n - Documentation - Add note that playwright is not supported on ARM type devices #1856\n - UI - Difference page - added 'title' to each change for nice mouse-over information about when the change occured\n - UI - Difference page - Tweak 'preview' page invite text\n - UI - Ability to select between any difference date ( from / to ) and minor UI cleanup for differences page (#1855)\n - UI - Difference page, make the button to find the preview page for triggers and ignored text easier to find\n - System - No need to run updates on fresh installs (#1854)\n - UI - Proxy configuration helper notes improvements\n - Preview/Difference page - When sharing the preview/difference page, highlight-to-ignore should login should be required (#1852)\n - Fetching - Clarifying how fetchers work with SOCKS5 proxies\n\n - 0.45.3\n - Update README-pip.md\n - Update README.md\n - LD JSON Price followers - Handle incorrectly created LD-JSON price structures better (#1837)\n - Dockerfile/fix: Update builder and runner to Python 3.11 (#1781)\n - Backend - Regular expression / string filtering refactor for Python 3.11 and deprecation warnings since Python 3.6 (#1786)\n - Update README.md\n - UI - BrowserSteps - Browser Steps interface screen should resize relative to the browser\n - BrowserSteps - <input> of type 'number' should use 'enter text in field'\n - Restock detect - bumping texts for restock detection\n - UI - Proxy Scanner tool should also understand when a filter is empty or contains only an image\n - UI + Fetching - Improving helper message when filter contains only an image (adding link to more help)\n - UI + Fetching - Be more helpful when a filter contains no text, suggest ways to deal with images in filters (#1819)\n - Building application - Upgrade test workflows to latest versions (#1817)\n - Page fetching - Fixed possible incorrect browser user-agent header in playwright/puppeteer/browserless fetchers (#1811)\n - UI - Add extra validation help for notification body with Jinja2 markup (#1810)\n - UI - More precise text to describe "current_snapshot" notification token\n\n - 0.45.2\n - Code/Test - Improve testing for creating backups\n - UI - Re-order notification field settings\n - UI - Notifications - Tidyup - Hide the notification tokens but show with a button/link\n - UI - Notifications - Tweak discord help text\n - RSS feeds - Fixing broken links from RSS index in some environments, refactor code (#152, #148, #1684, #1798)\n - UI - "recheck all" button should ignore blank/empty "tag" setting when set\n - Update README.md\n - UI - Fix spelling error\n - UI - Make tgram:// and discord:// examples in notification settings link to how-to pages (#1785)\n - Catch possible crash scenario for listing watches - `date_created` was missing on add (#1787)\n - Ability to select "No proxy" for a watch when you have proxy's configured\n - Updating notification library - Adds support for Pushy, PushDeer, PushMe and Matrix attachment support (screenshots)\n - Update README.md\n - UI - Fixing update for sort by "date created" or "#" in watch overview table ( #1775 )\n - Add 'diff_patch' notification body token - This will allow the diff to be generated in the "unified patch format." (#1765)\n - README/docs: Clarifying xpath version changedetection.io uses (#1773)\n\n - 0.45.1\n - UI - Fixing open/broken HTML which was causing some buttons to not display\n\n - 0.45\n - Adding Oxylabs proxy recommendation to proxy config page (#1756)\n - Fix - Link in the RSS feed was showing the path twice (when used in reverse proxy)\n - Fix - Regular Expression text in `ignore` and `trigger` were not processing correctly, also refactored for lower CPU usage (#1747)\n - Fix typo in README.md (#1759)\n - UI - "Test notification" button in "Group Tag" settings page was broken due to missing variable #1753\n - UI - Clicking 'ignore text' when highlighting text should clear the preview text button/area. #1754\n - Update documentation - How to set number of concurrent fetchers\n\n - 0.44.2\n - UI - Ability to highlight text and have it offered as a ignore-text option, really nice easy way to set ignores on changing text (#1746)\n - Update README.md\n - Enable ARMv8 builds (for RaspberryPi and other portable devices) (#1733)\n - Updating in app links\n - Updating URL validation library, ability to block access to simple (no dot) hostnames like "localhost" with BLOCK_SIMPLEHOSTS setting (#1732)\n - Re-enable ARMv6 builds (for Raspberry and other portable devices) (#1724)\n\n - 0.44.1\n - Re-enable ARMv7 builds (for Raspberry and other portable devices)\n - UI - Fixing darkmode switch icon\n\n - 0.44\n - Updating AppRise notification library, Improved pover, ntfy support, whatsapp updates, Pagertree support, Voip.ms support, Misskey support, plus many fixes and improvements.\n - API - Updating API description for handling a single watch\n - Removing docker build for RaspberryPi (armv6/armv7) for now due to packaging problems\n - Proxy scan improvements - handle custom proxies, dont restart when a scan is already running (#1689)\n - Browser Steps - When cleaning up old screenshots, check the file exists\n - Scan/Recheck proxies - Report filter not found as "OK" but with warning\n - Bug fix - Previously encountered fetch errors were sometimes not being cleared (#1687)\n - New feature - Helper button to trigger a scan/access test of all proxies for a particular watch (#1685)\n\n - 0.43.2\n - Bug - SMTP mailto:// Notification content-type (HTML/Text) fix and add CI tests (#1660)\n - Fix - Watches werent falling back to global default formats correctly when required (#1656)\n\n - 0.43.1\n - Bug fix - Notification settings were not cascading from global -> tags -> watch correctly in some cases (#1654)\n - Bug - Fix watch clone (#1647)\n - UI - Dont allow empty tag names (#1641)\n\n - 0.43\n - UI - Watch Table - Clicking anywhere on the watch list row table also activates the operations buttons and checkbox\n - UI/Functionality - Ability to manage/apply filters and notifications across tags/groups\n - UI - Fixes to dark mode toggle (#1629)\n - Docker container updates - use specific debian version (libssl1 vs libssl3) (#1630)\n - Code - Adding CI test for search (#1626)\n\n - 0.42.3\n - Bug fix - Fixed crash when deleting watch from UI when watch was already manually deleted from datadir (#1623)\n - README - Update links to new website\n - Fetcher / Parser - Automatically attempt to extract JSON from document when document contains JSON but could be wrapped in HTML (#1593)\n - Test improvement - Also test that custom request headers works with Playwright/Browserless (#1607)\n - Fetching - Be sure that content-type detection works when the headers are a mixed case (#1604)\n - UI/Fetching - Update "Filter not found" message to be more explanatory/helpful (#1602)\n - Restock monitor - Updating texts for tickets available/unavailable restock detection\n - Docs - Update README.md (Changed LXML re:math reference to re:match) (#1594)\n\n - 0.42.2\n - UI - Configurable pager size #1599 #1598\n - Fetcher - Ability to specify headers from a textfile per watch, global or per tag ( https://github.com/dgtlmoon/changedetection.io/wiki/Adding-headers-from-an-external-file )\n - Restock detection - Better reporting when it fails (#1584)\n - Fetcher - Puppeteer experimental fetcher wasn't returning the status-code (#1585)\n - Update README.md\n\n - 0.42.1\n - Fetcher fix - Clear any fetch error when the fetched document was the same (clear any error that occurred between fetching a document that was the same)\n\n - 0.42\n - UI - "Search List" also works for 'Title' field\n - UI - New "Search List" icon and functionality (#1580)\n - VisualSelector - Add message when first version cannot be found\n - UI - update link to official project page\n - BrowserSteps - Dont highlight elements that are the full page width (body, wrappers etc)\n - BrowserSteps - Support for float seconds (0.5 etc)\n - BrowserSteps - Session keep alive timer countdown fix\n - BrowserSteps - adding setup check\n - BrowserSteps - Refactored to re-use playwright context which should solve some errors\n - BrowserSteps - Be sure to select the most appropriate input/button/a when an input element is wrapped in a <div> or other\n - Fetcher - Experimental fetcher - dont cache embedded data URLs\n - Fetcher - Experimental fetcher improvements (Code TidyUp, Improve tests, revert to old playwright when using BrowserSteps for now) (#1564)\n - BrowserSteps - Include nice big start button SVG\n - BrowserSteps - Remove unreliable method for detecting if the element has a "click" listener and default to click (switch to 'Click X,Y' will return the right co-ords anyway)\n - Puppeteer fetcher, adding disk cache and other fixes (#1563)\n - UI - Adding shortcut list select button for "clear/reset history"\n - Fetcher - Experimental fetcher fixes, now only enabled with 'USE_EXPERIMENTAL_PUPPETEER_FETCH' env var (default off) (#1561)\n - UI - Adding shortcut list select button for "clear/reset history"\n - Element scraper - wrap offset detection in try/catch\n - BrowserSteps - BrowserSteps was not always following proxy information\n - BrowserSteps - remove minor delay\n - Fetcher - playwright/browserless - Use builtin node puppeteer handler in browserless, scales way better, and is faster (#1559)\n - UI - Fix back navigation / browser history (#1556)\n - UI - HTML validation improvements for edit forms (#1553)\n - UI - Various minor HTML validation fixes\n - UI - pagination - use count including tag filter for pagination display\n - UI - Notifications - Adding icon to "Add Email" button\n - UI - Adding pagination to watch list (#1549)\n - UI - Set selected watches as 'viewed' (#1550)\n - UI - Fix missing </span> in watch list when using restock detection\n - UI - Make sort order and type sticky in cookies, ability to sort by watch created time (#1519)\n - Notifications - Send test notification should use system defaults for body and title if not set in watch (#1547 #1503)\n - Adding generic changedetection.io SVG icon #1527\n - Tests - error test - be sure to clear results from other test parts\n - Update README.md\n - Tests - Add test to check that low level fetch errors are cleared on next check\n - Restock alerts - adding extra detection texts\n - Restock monitor - Identify the cases where the product is also definitely in stock (#1489)\n - Automated CI test for ensuring pypi package was built correctly (#1488)\n\n - GitHub container build - 'provenance' was disabled\n - 0.41.1\n - Fix for pip installations\n\n - 0.41\n - Notifications - Include triggered text token as `{{triggered_text}}` in notifications, so you can send just the content that matches. (#1485)\n - Notification tokens - add comment that the {{tokens}} can be used in the URLs also\n - Quick add form - adjust font size and rename stock recheck\n - Ability to set which text to process triggers on (added, removed, changed) according to the difference (#1483)\n - Restock / stock / out of stock monitor - bumping detection texts\n - Use brotli for reducing the size of the text snapshots (#1482)\n - Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481)\n - New feature - Restock / stock / out of stock monitor option/mode\n - UI - Clone/copy watch - A paused watch should not be checked when copied/cloned #1471.\n - Update README.md\n - Code - Abstract out the diff fetch types to make it easier to integrate new ones (#1467)\n - BrowserSteps - Adding `Goto URL` step\n - Fixing bad linebreak definition `</br>` in notifications and UI (#1465)\n - Notification Improvements - New tokens `{{diff_added}}` and `{{diff_removed}}`, removed whitespace around `added` and `into` ( Issue #905 ) (#1454)\n - Update README.md\n\n - Bug - False change alerts - code cleanups Re #962 (#1444)\n - Update README.md\n - Be sure that `process_changedetection_results` is off after PageUnloadable and EmptyReply exceptions from fetcher - Re #962 (#1439)\n - False change alerts fix - Don't reset watch checksum when a fetch error happens, adjust test to not test for fluctuating filter (#1437)\n - Library update - Replace bs4 with beautifulsoup4 (#1433)\n - API - Including `last_changed` timestamp in watch API info (#1436)\n - Update apprise to 1.3.0 (#1430)\n - API documentation - improving example for list watches\n - API documentation - improving example for snapshot history\n - API - Adding current version to 'System Information' endpoint, bumping API docs, Re #1429\n - Further improving API documentation Re #1426\n - Improving API documentation Re #1426\n - Browser Steps - Adding "Wait for text" and "Wait for text in element" Re #1427\n - Re #1382 - UI fix - sorting now works with selected tag\n - Dont rewrite/resave snapshot when its the same data, just bump the history index, saves disk space. (#1414)\n - Fetching - False alerts issue #962 - be sure to avoid triggering changedetection when checksums were the same (#1410)\n - Deleting a watch now removes the entire watch storage directory (#1408)\n - Use year/date in the backup snapshot zip filename instead of epoch seconds (#1377 #1407)\n - PDF text conversion - fix bug where it detected a site as a PDF file incorrectly Re #1392 #1393\n - Remove unused code (#1394)\n - UI - preview page - Fix bug where playwright/chrome was system default and [preview] didnt show snapshot\n - Adding example docker-compose.yml config to ignore errors from self-signed certs #1389\n\n - 0.40.2\n - Code cleanup - remove unused import\n - UI fix - Fix logic for showing screenshot on diff page (#1379)\n - Re #1365 - Playwright - Browser "Service Workers" should be enabled by default but unset via env var PLAYWRIGHT_SERVICE_WORKERS=block (#1367)\n - New setting to allow passwordless access to your 'diff' page - perfect for sharing your diff page securely, refactored login code (#1357)\n - Security - Possible stored XSS in watch list - Only permit HTTP/HTTP/FTP by default - override with env var `SAFE_PROTOCOL_REGEX` (#1359)\n - Playwright - Removing old bug fix where playwright needed screenshot called twice to make the full screen screenshot be actually fullscreen (#1356)\n - Fetch backend UI default fixes for VisualSelector and BrowserSteps (#1344)\n - Fix fetch UI default fetch backend option icon (#1343)\n - Docker container build - docker container buildx version change causing errors with watchtower and others (#1336)\n\n - 0.40.1.1\n - Re #1328 - add `-6` flag to enable IPv6 (#1329)\n\n - 0.40.1.0\n - Update README.md\n - Setting docker-compose.yml version to 3.2 so it works with portainer and others #1306 #1144 #1079\n - UI - Fix wrong logic when dealing with webdriver/playwright watch screenshot settings (#1325)\n - Ability for watch to use a more obvious system default fetcher (#1320)\n - Update README.md\n - pip - eventlet doesnt support dnspython >=2.3.0 (Fixes build error)\n - Reliability fix - Remove loop that could cause app to stop checking if data changes (#1313)\n - API - Improvements, support PUT for updating existing watch, set muted state, set paused state, see https://changedetection.io/docs/api_v1/index.html (#1213)\n - Data storage - Don't recreate DB if its corrupt, exit with error cleanly so operator can look into the problem (#1296)\n - UI: Updating queued success message (#1285)\n - README.md - Fix release link (#1277)\n - Notifications: updating apprise (slack notification fixes and others) (#1272)\n - Remove docker-compose version so it works on any modern version #1144 (#1268)\n - Update the docker compose file to any version (#1079) (#1144)\n - IPv6 support for listening on (#1267)\n - Test improvements (#1264)\n\n - 0.40.0.4\n - UI - Suggest adding proxy for watch when 403 access denied is reached (#1260)\n - Filters & Notifications - fixed tokens in filter not found notification\n - UI - Fix broken html tags in settings page\n - Proxy Settings in UI - TidyUp BrightData text\n - Ability to configure extra proxies via the UI (#1235)\n - Docker container updates - use Python 3.10, remove unused packages\n - Tidy up list icons a bit (#1250)\n - PDF File change detection - Initial PDF fetcher support with basic text extraction (#1244)\n - Testing - Run test as fully built docker container (#1245)\n - Dark mode - system setting var is not required (its cookie based)\n\n - 0.40.0.3\n - Visual Selector - Select smallest/most precise element first, better filtering of zero size elements\n - Fetching - Check the most overdue watch first (#1242)\n - Overview list - Checkbox action "Recheck"\n - Playwright - Better error reporting and re-try fetch on fail once (#1238)\n - Fetching - Always sort the key order of JSON content for less false alerts (May cause an alert on upgrade, but will be better going forwards) #1219\n - Fetcher + VisualSelector - xPath filter with attribute filter was breaking the element finder\n - Fetcher - CPU usage - Skip processing if the previous checksum and the just fetched one was the same (#925)\n - Playwright+BrowserSteps - Fetch changes - Fetch simply after page starts rendering + delay seconds, disable service workers\n - Improve ARM/rust build comment\n - README.md - Improving JSONPath example for LD+JSON product data\n\n - 0.40.0.2\n - Price follower - Dont scan for ldjson data when 'no' was clicked on the suggestion (#1207)\n - Adding missing parts for pip build Re #1206\n\n - 0.40.0\n - VisualSelector - Exclude items that are not interactable or visible\n - Automatically offer to track LD+JSON product price data (#1204)\n - UI - favicon callback no longer needed\n - Test cleanups (#1196)\n - Update runtime.txt (#1198)\n - Dark mode - HTML template tidy up (#1197)\n - UI - watch tags also known as watch tag / label\n - Notification templates - bug in update, was updating the main system instead of the watch notification_title incorrectly\n - Extract data - minor improvement to example\n - Darkmode - Pause/Mute notification colour fix, re #1195\n - Notification - Support for standard API calls post:// posts:// get:// gets:// delete:// deletes:// put:// puts:// (#1194)\n - Notifications - tokens/jinja2 templating (#1184)\n - Dark mode - more colour fixes\n - Test improvement - improving notification error network test\n - Extract text as CSV - Extra validation (#1192)\n - Dark mode - make watch list easier to read when theres 'unviewed' entries\n - New feature - Simple extract data by regex from all historical watch text into CSV (#1191)\n - UI - Cursor over labels should be pointer\n - Dark mode - Make watches with errors easier to read\n - Dark mode - cookie path should be all site\n - Tweaks - adding hover/title to dark mode button\n - UI - Dark Mode (#1187)\n - docker-compose - Add playwright/selenium container dependencies example (#1178)\n - BrowserSteps - Can be shared by the watch share link\n - UI - Make tabs hoverable\n - Favicon multiplatform and path fix/update (#1176)\n - BrowserSteps - Cleanup interface on shutdown\n - BrowserSteps - More work on cleaner shutdowns of browser session\n - BrowserSteps - Forcefully shutdown playwright to prevent any race-conditions waiting for it to shutdown\n - BrowserSteps - Make the UI require an extra step so it doesnt slow down the experience when clicking through the tabs (#1175)\n - BrowserSteps - Use correct mimetype for screenshot update\n - BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)\n - BrowserSteps - Add 'Execute JS' step\n - BrowserSteps - Also try to find clickable div/spans\n - Update README.md\n - Update README.md\n - BrowserSteps - Element finder filter (offpage) should also calculate top scroll offset\n - Visual Selector and BrowserSteps - More accurate element detection when the page auto-scrolls on load Re #1169\n - Extra validation for URLs with template markup (#1166)\n - Browser Steps - adding 'please wait' text while loading\n - Re #1163 psutil missing from pip requirements\n - Update README.md\n - Update README.md\n - VisualSelector & BrowserSteps - Scraper improvements, remove duplicate code\n - Bumping VisualSelector example animation\n - Remove dupe xpath finder prep code\n - Browsersteps 'Beta' label image path fix\n - Configurable "Browser Steps" when Playwright/Chrome is configured (enter text, scroll, wait for text, click button etc) (#478)\n - Update README.md - Make docker instructions easier to follow on Windows (#1158)\n\n - 0.39.22.1\n - Notification screenshot/JPEG was not being regenerated correctly (#1149)\n - Re #1148 - Notification screenshot/JPEG was not being regenerated correctly\n - Update README.md\n - Update README.md\n\n - 0.39.22\n - Fix dangling HTML tag from screenshot notification\n - Notification screenshot option should only be available to webdriver/playwright watches, screenshot sent as JPEG to save bandwidth, Simplify the logic around screenshot, (#1140)\n - Minor test improvements\n - Option to attach screenshot to notification (#1127)\n - VisualFilter - check previously set filters were set before highlighting\n - Add diff view option for JSON compare (comparing the fields defined on each. The order of fields, etc does not matter in this comparison.)\n - Update visual text difference library, add option to ignore whitespace when viewing diff (#1137)\n - Make VisualSelector show first available multiple selector, refactor to make more maintainable (#1132)\n - Make link to notification debug log easier to find (#1130)\n - Bump notification library (#1128)\n - Re #1126 HIDE_REFERER setting had wrong default\n - Test: Re-test under HIDE_REFERER condition, use strtobool so you can use 'False' (#1121)\n - Stability fix related to the new watch check count (#1113)\n - Use deepcopy to stop possible data corruption (#1108)\n - Code- Use dict .get instead of key\n - Adding a check counter to watch fetching (#1099)\n - Update README.md\n - HIDE_REFERER incompatible with password based login, added comment to code #996\n - Update README.md\n - Filters can now accept a list/multiple filters (#1064) #623\n\n - 0.39.21.1\n - Playwright extension added back to Dockerfile to resolve conditional fix Alpine (musl) based systems (#1087)\n\n - 0.39.21\n - Disable version check when pytest is running (#1084)\n - Removing unused code (#1070)\n - Docker & python - Jq conditional pip requirements.txt include (Don't install in Windows because theres no Windows library/wheel)\n - Docker & python - Use pip conditional requirements to not install playwright for ARM (unsupported on ARM) (#1067)\n - UI - Make fetch error more readable (#1038)\n - Update README.md\n - Re #1052 - Watch 'open' link should use any dynamic/template info (#1063)\n - Remove accidental files\n - Backups and Snapshots - Data directory now fully portable, (all paths are relative) , refactored backup zip export creation\n - Re #1052 - Dynamic URLs, use variables in the URL (such as the current date, the date in a month, and other logic see https://github.com/dgtlmoon/changedetection.io/wiki/Handling-variables-in-the-watched-URL ) (#1057)\n - API - system info - allow 5 minutes grace before watch is considered 'overdue'\n - API - Adding basic system info/system state API (#1051)\n - Build - Fix syntax in container build test (#1050)\n - Building - Test container build on PR\n - Testing - Use same version of playwright while running tests as in production builds (#1047)\n - update path for validation in the CONTRIBUTING.md (#1046)\n - History index safety check - Be sure that only valid history index lines are read (#1042)\n - Option to Hide the Referer header from monitored websites. (#996)\n\n - 0.39.20.4\n - Better cross platform file handling in diff and preview (#1034)\n\n - 0.39.20.3\n - Windows - diff file handling improvements (#1031)\n - Also include tests in pip build\n - Update README.md\n\n - 0.39.20.2\n - Windows - JQ - Make library optional so it doesnt break Windows pip installs (#1009)\n - Adding test - Test the 'execute JS before changedetection' (#1006)\n\n - 0.39.20.1\n - Code - check containers build when Dockerfile or requirements.txt changes (#1005)\n - Adding `make` to Dockerfile build as required by jq for ARM devices\n - Dont use default Requests `user-agent` and `accept` headers in playwright+selenium requests, breaks sites such as united.com. (#1004)\n\n - 0.39.20\n - Adds support for jq JSON path querying engine (#1001)\n - Adding link to BrightData Proxy info (#1003)\n - Remove quotationspage default watch\n - Notification library: Bump apprise to 1.1.0 (signal, opsgenie, pagerduty, bark and mailto fixes, adds support for BulkSMS and SMSEagle) (#1002)\n - Selenium fetcher - screenshot should be taken after 'wait' time, not before #873\n - Upgrade Playwright to 1.26\n - Render Extract Configurable Delay Seconds should also apply after executing any JS #958\n - Re #958 - remove change screensize, should be in 1280x720 default, was causing "Unable to retrieve content because the page is navigating and changing the content." on some sites\n - Tidy up proxies.json logic, adding tests (#955)\n - Update README.md - Include BrightData suggestion\n - Improve Proxy minimum time debug output\n - Default proxy settings fixes\n - Use proxies.json instead of proxies.txt - see wiki Proxies section (#945)\n - Upgrade Playwright to 1.25\n - Update README.md\n\n - 0.39.19.1\n - Notification - code tidyup\n - Watch list & notification - Adding extra list batch operations for Mute, Unmute, Reset-to-default\n - Notification - Reset defaults button should be on edit page only\n - Notification watch settings - add button to make watch use defaults (empties the settings)\n - Notification system update - set watch to use defaults if it is the same as the default\n - Fix typo (#924)\n\n - 0.39.19\n - Update README.md\n - Tweaks to python PIP readme\n - Use play and pause separate icons (#919)\n - Further notification settings refinement (#910)\n - Reliability improvement - Check watch UUID exists when reporting missing path (#915)\n - repair pip readme\n - Test improvement - Visual selector data loads as JSON (#895)\n - Cleaner separation of watch/global notification settings (#894)\n - Code maintenance - Removing old function (#875)\n - Show screenshot age in [preview]\n - Update README.md\n - Update README.md\n - Update README.md\n - Update bug_report.md\n - Update bug_report.md\n - Update README.md\n\n - 0.39.18\n - More data saving pre-checks (#863)\n - Update screenshot\n - Checkbox operations - reorder buttons for safety\n - UI feature - Basic checkbox/group operations (#861)\n - Bug fix - automatically queued watch checks weren't always being processed sequentially\n - Playwright - Support proxy auth mechanisms (#859)\n - Update README.md\n - Update README.md\n - Skip processing when watch was deleted\n - Playwright fetcher didn't report low level HTTP errors correctly (like Connection Refused) (#852)\n - Be sure visual-selector data is set when xPath/CSS filter is not yet found (#851)\n - Visual selector data not being saved by refactor\n - 'Save chrome screenshot' checkbox never used, removing, we always save the screenshot. (#844)\n - Crash fix: Data store sub-directories werent always being created when needed (#842)\n - Make the table header easier to understand when sorting (#840)\n - Column sorting (#838)\n - Update README.md\n - Revert "don't process paused entries after queue", so we can still manually recheck a paused watch\n - Remove 'last-changed' from url-watches.json and always calculate from history index (#835)\n - Massive improvements to error handling - show separate output for non HTTP 200 status replies\n - Execute JS should happen after waiting seconds\n - Upgrade playwright python driver (#834)\n - Crash protection - handle the case where watch was deleted while being checked (#833)\n - Don't process a watch if it was paused after being queued (#825)\n - Notification Library Update (fixes for Home Assistant) - update requirements.txt (#818)\n - Remove social links for now\n\n - 0.39.17.2\n - Test fix - Remove debug from test\n - Security update - Password could be unset from settings form unexpectedly (#808)\n - Disable SIGCHLD Handler for now - keeping SIGTERM for DB writes\n - Handle SIGTERM for cleaner shutdowns (#737)\n - Remove [save & preview] button, the preview is not updated live so it can lead to confusion (#801)\n - Feature - priority queue - edited and added watches should get checked before automatically queued watches (#799)\n - [preview current] cleanup code and add test\n - Feature - mute notifications (#791)\n - Test improvement - remove unnecessary step\n\n - 0.39.17.1\n - Bug fix: Filter failure detection notification was interfering with change-detection results, added test case (#786)\n - README.md - new Discord invite link\n\n - 0.39.17\n - Add https://discord.com/api notification hook to the automatic truncation due to Discords 2000 char limit\n - UI Feature - Add watch in "paused" state, saving then unpauses (#779)\n - Enhancement - support xPath text() function filter, for example "//title/text()" in RSS feeds (#778)\n - Bug fix - Filter "Only trigger when new lines appear" should check all history, not only the first item (#777)\n - Visual Selector direct element finder fix\n - Update README.md\n - Update README.md links\n - Filter failure notification send default enable now controlled by setting Env var\n - Refactor of extract text filter - Regex, support Regex (groups) and all python regex flags via /something/aiLmsux (#773)\n - Update README.md - adding LinkedIn link\n - Update README.md - Adding Discord and YouTube links\n - Bug fix for alerting when xPath based filters are no longer present (#772)\n - Send notification when CSS/xPath filter is missing after more than 6 (configurable) attempts (#771)\n - mailto plaintext handling fix for 'plaintext' apprise integration\n - Minor code cleanups\n - Notifications - email - Correctly send plaintext notification email with plaintext header (#767)\n - Form text tweak - Regex clarification (#766)\n - Update README.md\n - Handle simple obfuscations - HomeDepot.com style price obfuscation (#764)\n - Fixing docker-compose.yml PLAYWRIGHT_DRIVER_URL example URL\n - Notifications fix - Discord - added discord webhook base url to truncation rules (#753)\n - Update Playwright URI Env example with stealth setting and CORS workaround (more reliable fetching)\n - remove extra file\n - removing package-lock.json - not required to be in git\n - Share-icon cleanups\n - Test improvement: Extract text should return all matches\n - Bug fix: RSS Feed should also announce utf-8 charset\n - Regex extract filter: Return all regex results instead of first match (#730)\n - Ability to specify JS before running change-detection (#744)\n - Playwright - log console errors to output\n - UI Improvement - Clarifying "Visual Filter" tool as "Visual Selector Filter"\n - Use environment variables to override new watch settings defaults (user-agent, timeout, workers) (#742)\n - Update docker-compose.yml - Remove duplicate environment variables from playwright-chrome sample config in docker-compose.yml (#738)\n\n - 0.39.16\n - Fix notification apprise application name to changedetection.io #731\n - Update README.md\n - [new filter] Filter option - Trigger only when NEW content (lines) are detected ( compared to earlier text snapshots ) (#685)\n - Playwright - Use HTTP Request Headers override (Cookie, etc)\n - lang: prefer 'clear (snap) history' to 'scrub' (#721)\n - Minor diff page improvements - list should be sorted 'newest first' and no need to include the current version to compare against (#716)\n - bug fix: `last_changed` was being set on the first fetch, should only be set on the change after the first fetch #705\n - Update README.md\n - Improve docker-compose.yml browserless docker container example, add env var for STEALTH and BLOCK_ADS (#701)\n - New filter - Block change-detection if text matches - for example, block change-detection while the text "out of stock" is on the page, know when the text is no longer on the page (#698)\n - Docker containers - :latest is now stable release, :dev is now master/nightly\n - Trigger filters improvement- it's possible some changes weren't getting detected because the previous checksum only recorded when an event occurred (#697)\n - Some changes werent getting triggered because the previous checksum only recorded when an event occured\n - Notifications regression bug in 0.39.15 - only sent the first notification URL\n - Playwright screenshots - no need for high-res "bug workaround" screenshot, use lower quality/faster configurable image quality env var\n - Adding extra check when updating DB on ReplyWithContentButNoText\n - Notifications log - log what was sent after applying all cleanups\n - Re #555 - tgram:// notifications - strip added HTML tag which is not supported by Telegram\n - Give more helpful error message when a page doesnt load\n - Tweaks to playwright fetch code - better timeout handling\n - Re #580 - New functionality - Random "jitter" delay to requests (#681)\n\n - 0.39.15\n - Watch overview list - adding spinner to make it easier to see whats currently being 'Checked'\n - Preview section - add helpful check\n - Send test notification - improved handling of errors\n - Notification log - also log normal requests and make the log easier to find\n - Update bug_report.md\n - Use correct RSS CDATA handling (#662)\n - Improve logging (#671)\n - New [scrub] button when editing a watch - scrub single watch history (#672)\n - Diff + Preview - Hide date selector widget when viewing screenshots as its not yet possible to compare screenshots (but will be soon!)\n - Diff + Preview - Fixing screenshot behaviour after preference change\n - Screenshot handling on the diff/preview section refactor (#630)\n - Shared watches - include "Extract text" filter\n - Improve error message when filter not found in page result (#666)\n - "Extract text" filter - improve placeholder example\n - Visual selector - 'clear selection' button should clear the filter also\n - New feature - "Extract text" filter ability (#624)\n - Fixing RSS feed HTML content formatting (#662)\n - Update notification library - Improving telegram support\n - 'Mark all viewed' button was missing in this version, added test also. (#652)\n - Content fetcher - Handle when a page doesnt load properly\n - Playwright - Correctly close browser context/sessions on exceptions\n - Move history data to a textfile, improves memory handling (#638)\n - Update feature_request.md\n - Remove UK Covid news\n - Visual Selector fix: Firefox compatibility - Visual Selector (#646)\n - Remove group tag arbitrary length limit (#645)\n - Distill.io import bug fix when no tags assigned to a watch (#557)\n - Ignore whitespace on by default\n - Visual Selector - clear events when changing tabs\n - Minor code cleanup\n - Re #616 - content trigger - adding extra test (#620)\n - README.md update Visual Selector tool - tidy up screenshots, improve text\n - Playwright - ByPass CSP for more reliable JS scraping, disable accept downloads\n - VisualSelector - Better handling of filter targets that are no longer available in the HTML\n - Update bug_report.md\n - 0.39.14.1\n\n - 0.39.14.1\n - pip build fix - include API module\n - Visual Selector - be more resilient when sites interfere with the xPath scraping\n - Adding new Visual Selector for choosing the area of the webpage to monitor - playwright/browserless only (#566)\n\n - 0.39.14\n - Fix encoding errors with XPath filters from UTF-8 responses (#619)\n - API Interface (#617)\n - Add note that changedetection is not performed on the screenshot just yet (WIP https://github.com/dgtlmoon/changedetection.io/pull/419 )\n - Fixing edit template HTML\n - Proxy settings on watch should have a "[ ] default" option (#610)\n - Input field tidyup (#611)\n - Update wiki link for 'More info' about sharing a watch and its configuration\n - Option to control if pages with no renderable content are a change (example: JS webapps that dont render any text sometimes) (#608)\n - Playwright - raise EmptyReply on empty reply, no need to process further\n - Re #214 - configurable wait extra seconds for webdriver requests before extracting text (#606)\n - Fix PLAYWRIGHT_DRIVER_URL default value (cf. #587) (#599)\n - Update PIP readme.md\n\n - Fixing Pip install problem - Update MANIFEST to include model/ subdir, improving imports (#593)\n\n - 0.39.13\n - Distill.io JSON export file importer (#592)\n - Ability to specify a list of proxies to choose from, always using the first one by default, See wiki (#591)\n - Improving Playwright docs (#588)\n - Playwright - code fix\n - Playwright fetcher - more reliable by just waiting arbitrary seconds after the last network IO\n - Make proxy configuration more consistent - see https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration (#585)\n - Playwright fetcher - use the correct default User-Agent\n - Toggle visibility of extra requests options/settings when not in use (#584)\n - Add new fetch method: Playwright Chromium (Selenium/WebDriver alternative) (#489)\n - Simplify scrub operation (simply cleans all) (#575)\n - Bugfix - dont update record when deleted during check\n - Improving support info in README.md\n - Handle deletions better (#570)\n - Data storage bug fix #569\n - Upgrade notifications library - fixing marketup in email subject\n - Ability to 'Share' a watch by a generated link, this will include all filters and triggers - see Wiki (#563)\n - Upgrade notifications library Re #555 - fixing telegram HTML markup in notification title\n - Unify MINIMUM_SECONDS_RECHECK_TIME env var variable to 60 seconds\n - Seconds/minutes/hours/days between checks form field upgrade from 'minutes' only (#512)\n - Form styling improvements\n - Form field handling improvements - fixing field list handler for empty lines\n - Fix "Add email" button in main global notification settings\n - Test notification button fixed in main settings (#556)\n - tgram:// be sure total notification size is always under their 4096 size limit\n - Shows which items are already in the queue, disables adding to the queue if already in the recheck queue (#552)\n - Notifications - Signal API support, Ntfy support, hotmail, matrix, Gotify API fixes\n - Discord:// notification size limit - also includes the notification title\n - Fix spelling errors\n - Update README.md\n - Update README.md\n - Import speed improvements, and adding an import URL batch size of 5,000 to stop accidental CPU overload (#549)\n - Ability to set the default fetch mode via the DEFAULT_FETCH_BACKEND variable\n - Refactor form handling (#548)\n - Adding support for change detection of HTML source-code via "source:https://website.com" prefix (#540)\n - Re-label the quick-add widget placeholder 'tag' to 'watch group'\n - HTTP Fetcher code improvements\n - Adding RSS metadata auto-discovery\n - Upgrade WTforms form handler to v3 (#523)\n\n - 0.39.12\n - Miscellaneous settings form visual improvements (#535)\n - Option to render links as [Some Text ](/link), adds the ability to change-detect on hyperlink changes\n - Specify our Discord avatar_url as default avatar_url\n - Minor git updates\n - Fix screenshot tab name\n - Discord:// notifications should be cut to 2000 chars or Discord will not process them. (#531 + #323)\n - Make long reports in the notification error log easier to read\n - [Add email] button in notification settings with a prefix set from NOTIFICATION_MAIL_BUTTON_PREFIX env variable when defined. (#528)\n - Update README.md\n - Skip processing a watch into the RSS feed if there's not enough data to examine (fixes Internal Server Error when accessing the RSS feed) (#521)\n - Introduce an AJAX button for sending test notifications instead of the checkbox (#519)\n - Make text tab always available at default\n - When fetching a snapshot via Chrome, make the most recent screenshot available on the Diff and Preview pages (#516)\n - Remove 'unviewed' status in watch table when Diff link clicked (#514)\n - RSS feed CDATA should contain difference output\n - Fix - {diff} and {diff_full} notifications tokens were not always including the full output\n - Update README.md\n - Update README.md\n - Minor UI cleanups (mobile tabs, font sizing) (#503)\n - Fix typo in Filters & Triggers settings. (#495)\n - Add autofocus attribute to password login field (#496)\n\n - 0.39.11\n - Microsoft Windows installation fixes (#492)\n - GitHub tweak - container tags should be CSV list (Fix ghcr.io not building)\n - GitHub tweak - build containers also on push to master\n - Allow changedetector to ignore status codes as a per-site setting (#479) (#485)\n - Security update - Use CSRF token protection for forms, make "remove password" use HTTP Post (#484)\n - Security update - Protect against file:/// type access by webdriver/chrome. (#483)\n - Only build container on GitHub releases, not tests\n - Also change container names to help stop some DNS issues\n - Detect byte-encoding when the server mishandles the content-type header reply (#472)\n - Improving form/edit example markup\n - JSON diff/preview should use utf-8 encoding where possible (#465)\n - Fix typo in settings form\n - Add python venv to .gitignore\n\n - 0.39.10\n - Add filter to remove elements by CSS rule from HTML before change detection is run (#445)\n - Minor updates to filters form text\n - Re #448 - Dont use changedetection.io as the container name and hostname, fix problems fetching from the real changedetection.io webserver :)\n - Testing - Refactor HTTP Request Type test (#453)\n - Make table header font size the same as content\n - Adjust background colours\n - Handle the case where the visitor is already logged-in and tries to login again (#447)\n - Make the Request Override settings easier to understand\n - Minor tweak to notification token table\n - Style tweak to watch form\n - Login form style fixes\n - Upgrade apprise notification engine to 0.9.7 (important telegram fixes)\n - Remove pytest from production release pip requirements\n - Style fix for background image relative to X-Forwarded-Prefix when running via reverse proxy subdirectory\n - Re-arranging primary links so the important ones are easier to find on mobile\n - Set authentication cookie path relative to X-Forwarded-Prefix when running via reverse proxy subdirectory (#446)\n - Upgrade inscriptis HTML converter to version 2.2~ (#434)\n - Better text/plain detection and refactor tests (#443)\n - Tweak support tabs and text (#440)\n - Include link to changedetection.io hosted option (#439)\n - Improved CPU usage around the loop responsible for what sites needs to be checked\n - Update README.md with hosting options\n\n - 0.39.9\n - Minor reliability upgrade for large datasets - retry deepcopy (#436)\n - "Recheck" button should work when entry is in paused state\n - Better file exception handling on saving index JSON\n - Fix small issue in highlight trigger/ignore preview page with setting the background colours, add test\n - Ensure string matching on the ignore filter is always case-INsensitive\n - Ability to visualise trigger and filter rules against the current snapshot on the preview page\n - Update README.md\n - XPath RegularExpression support\n - better checking of JSON type\n - Make system level errors from the HTTP fetchers easier to find (#421)\n - Bump node-sass from 6.0.1 to 7.0.0 in /changedetectionio/static/styles (#415)\n - Dont allow redirect on login, it's safer and more reliable this way (#414)\n - When using Env. FETCH_WORKERS or WEBDRIVER_DELAY_BEFORE_CONTENT_READY , it should be type int\n\n - 0.39.8\n - Number of fetching workers can be overriden by Env "FETCH_WORKERS" (#413)\n - Adding Env var "WEBDRIVER_DELAY_BEFORE_CONTENT_READY" to wait n seconds before extracting the text from the browser\n - Language fix "watches are rechecking." it actually puts them into an internal queue "watches are QUEUED for rechecking"\n - Use flask url_for() for webdriver chrome icon instead of relative path\n - Fix typo in the startup create-directory command suggestion (#405)\n - Introduce -h option to allow listening not on 0.0.0.0. (#406)\n - Refactor tests for notification error log handler (#404)\n - Notification error log handler (#403)\n - Add notification note - tgram:// bots cant send messages to other bots, so you should specify chat ID of non-bot user.\n - fixed the reference to wiki for rpi section (#402)\n - /preview format doesnt need <pre> - fixing too many returnlines in content on diff/preview page\n - Update README.md\n - Update README - Fix docker section\n - Update README - Tidy up sections\n - Offer instance on Lemonade Tidy README\n - Ability to use a generated salted password in deployments as env var SALTED_PASS (#397)\n - #323 Adding note about discord:// 2000 char limit (#392)\n - plaintext mime type fix - Don't attempt to extract HTML content from plaintext, this will remove lines and break changedetection (#391)\n - .add_watch() can accept empty tag Use https://changedetection.io/CHANGELOG.txt as a nice default page to watch\n - Add option for tags on import (#377)\n - Update CONTRIBUTING.md\n - Update README.md\n - Fix bug where diff and diff_full were switched in notification templates. (#380)\n - Closes #378\n\n - 0.39.7\n - Scrub watch snapshot fixes\n - Simple HTTP auth (#372)\n - Adding note about JS pages\n - Notification settings defaults and validation (#361)\n - Filters settings helper text tidy-up\n - Add test for low-level network error text handling\n - Add API endpoint for current snapshot (#359)\n - Clarify notice/messages around changing ignore text\n\n - 0.39.6\n - Heroku tweaks (backup download) (#356)\n - XPath support (#355)\n - Better handling of EmptyReply exception, always bump 'last_checked' in the case of an error (#354)\n - Adding note in comments for working arm64 chrome with rPi-4 (#336)\n - fix typo in README.md (#350)\n - Re #348 - Add test for backup, use proper datastore path\n - Update README.md\n - Be sure that documents returned with a application/json header are not parsed with inscriptis (#337)\n - Re #340 - snapshot should not be modified by ignore text (#344)\n - Re #133 Option for ignoring whitespacing (#345)\n - Re #342 notification encoding (#343)\n - Update README.md\n - Adding global ignore text (#339)\n - Adding new proxyType to selenium mappings\n - Use selenium 4.1.0\n - Bumping selenium version re https://github.com/dgtlmoon/changedetection.io/pull/331#issuecomment-1003323594\n - Add socksVersion mapping (#331)\n - Fix broken RSS link fields\n - RSS Link links you back to the difference UI/JS page, RSS Description is the page you're watching, and RSS Title is the page you're watching\n - Unify Filters and Triggers tabs into a single tab\n - Move 'request type' field to the new 'Requests' tab\n - Aligning call signatures #325\n - Extend Request Parameters to add Body & Method (#325)\n - Update README.md\n - Create CONTRIBUTING.md\n - Update README.md\n - Re #267 - Pass settings for the proxy setup for webdriver (#326)\n - Update README.md\n - Update README.md\n - Update README.md\n\n - 0.39.5\n - Update feature_request.md\n - Update issue templates\n - Update bug_report.md\n - Update issue templates\n - W3C HTML validation issue around RSS icon\n - Closes #323 adds link to wiki\n - Update README.md\n - Update README.md\n - improve theming docs\n - Update README.md\n - Update README.md\n - Closes #315 - Include library apprise Notify_mqtt\n - Re #80, sets SECLEVEL=1 in openssl.conf to allow monitoring sites with weak/old cipher suites (#312)\n - Go back to docker hub\n - RSS allow access via token (#310)\n - Adding deploy to Heroku button\n - Adding heroku app.json app\n - Tweak runtime Heroku version\n - Tweaking heroku Procfile\n - Adjust buildpacks on Heroku\n - Adding heroku python3 runtime config\n - Try simpler heroku recipe\n - -C option to create a datadir if it doesnt exist\n - Re #308 - Adding test and including settings in clone operation (#309)\n - fixing too small font in diff UI (#260)\n - Update README.md\n - Send diff in notifications (#296)\n - Fix scrub form theme\n - Scrub dates: Fix date regex limit handler parsing\n - Wait 60 seconds or until stop_thread is set\n - Check that a notification URL is set when sending the test notification (#300)\n - Flask 2 (#299)\n - Re #269 - Show current/correct BASE_URL information (#271)\n - Re #269 - Fix env var comment name\n - Enable Markdown and HTML notifications. (#288)\n\n - 0.39.4 release\n - Re #286 - Solving lost data/corrupted data - Tweak timing and try to write to a temp file first (#292)\n - Fix element paths when using reverse proxy subfolder (#272)\n\n - 0.39.3 release\n - Re #264 - fixing clone watch operation\n - Re #265 - extended jsonpath support (#266)\n - Re #265 - wasnt catching the jsonpath exception due to invalid jsonpath expressions properly\n - Re #257 - Handle bool val of json path better (#263)\n - Re #249 - Add EXPOSE 5000 to Dockerfile\n - Provide better combination of chardet and urllib3\n - Prefer GHCR.io over DockerHub (#245)\n - Limit branches/tags of container build\n - Re #213 - Adding screensize examples to selenium container\n - Be more specific about tagged release builds\n - Fix :latest release worflow syntax check\n - Form helper - explain where the webdriver setting comes from\n - Rename workflow name\n - Just 'published' and 'edited' package release is enough (remove 'created')\n\n - Fixing workflow tag syntax issues\n - fix broken workflow syntax\n - add step for metadata debug, see if it runs by checking workflow tag name\n - Container build/push doesnt need to be so specific\n - Oops on/release was in the wrong block\n - release also on edited, published\n - Run workflow on release\n - Use a better switch mechanism for build type\n - version 0.39.2\n - Configurable BASE_URL (#228)\n - Split python pip builder to its own release based workflow\n - remove accidental syntax add\n - Re #242 - app was treating notification field defaults as the field value (#244)\n - attempt to re-enable docker layer cache\n - Forgot GHCR tag with version\n - Limit container build to releases and master\n - Fix GHCR login\n - Use the same workflow for tag and release\n - Drop redundant build workflow\n - try :latest and :tag in same workflow run\n - Separate workflows\n - Docker image build issues (#243)\n - Re #239 - Individual GUID for watch+changeevent (#241)\n - Update README.md\n - Re #232 - Use a copy of the datastore incase it changes while we iterate through it (#234)\n - Setting for Extract <title> as title option on individual watches (#229)\n - GitHub repo build platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n - GitHub container repo (#227)\n - Remove extra build step\n - push github container master also\n - Tidy up workflow names\n - Attempt to setup GitHub Container Registry\n\n - v0.39.1\n - Re #185 - [feature] Custom notifications templates per watch (#226)\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Re #225 - Notifications refactor token replacement fix possible missing value for watch_title\n - Re #42 - Notifications refactor token replacement fix possible missing value for watch_title\n - Bump tar from 6.1.6 to 6.1.9 in /changedetectionio/static/styles (#209)\n - Adds 'Create Copy' feature to clone a watch (#184)\n - adding specific test (#205)\n - New notification tokens - watch_uuid, watch_title, watch_tag, (#201)\n - Re #203 - validate tokens (#204)\n - No point hiding the notifications customisation area because it's now in its own tab\n - Update README.md\n - Test - prove that notifications are not being sent when content does not change\n - remove quotes from env vars\n - Re https://github.com/dgtlmoon/changedetection.io/discussions/189 A note to not use quotes in env parts\n - WebDriver fetcher - settings - when an alternative one is configured, show it in the label\n - Update README.md\n\n - Installation via pip (#186)\n - Update README.md\n - Trigger text/wait (#187)\n - Reword group tag - more obvious name\n - Fix img alt/title accesibility for pause icon\n - Let the fetcher throw an exception which will be caught and handed to the operator anyway\n - Example placeholder was pushed out\n - Move fetcher tab back to general - save space on mobile\n - WebDriver test fetch should use environment var too\n - Add fetch option to each watch\n - Chrome/Webdriver support for Javascript websites (#114)\n - Fixing tar npm security issue npm install "tar@>=6.1.2"\n\n - tag 0.38.2\n - Re #172 - be sure that we are non-greedy matching the first : when splitting the headers so we dont break "Cookie" header (#175)\n - Update heroku.yml\n - Re #156 - PORT should always be an Integer\n - Re #159 - Adding env var example to docker-config.yml\n - Add Heroku Deployment Support (#159)\n - Re #154 - Handle missing JSON better\n - high res\n - higher res screenshot\n - Update screenshot\n - Assert that html_tools.JSONNotFound is correctly raised\n - Re #154 Ldjson extract parse (#158)\n - Responsive fix for input field on mobile\n - Re #148 - Always set something for {base_url} so we dont send possibly an empty body/title notification which could break some services.\n - Add medium-size-desktop class to notification custom title\n - Notification default: Make sure to use atleast some text here, a blank notification body could be problematic for some services\n - Re #150 - stop using 'size' across all elements and rely on CSS for a better mobile experience (stops fields from pushing out)\n - fix: setting overflow in mobile view (#150)\n - Re #121, #123 - Show the current base_url value\n - Re #149 - allow empty timestamp limit for scrub operation\n - Dont show "new version available" message when password is enabled and user is logged out\n - test fix - dont trigger notifications in header test\n - Strengthen the notification tests\n - Re #137 - Adding test to confirm that headers are not repeated\n - Add debug output to notify loop\n - Add note to field\n - Cleanup test helper data before and after running\n - Improve debug info\n\n - 0.38.1 tag\n - Re #143 - Remove old notification test code, fix form handler (#145)\n - Update README.md\n - Re #135 - refactor the quick add widget (#136)\n - Partially revert 47e5a7cf0990bc958061ce57de8ae88f3fbd39aa (#138)\n\n - use a github action for getting the tag\n - rename tag build runner\n - fix tag\n - build and push tag\n - Re #76 - Fixing links\n - Cleaner is to let flexbox overflow and scroll on the X where needed\n - #76 app path prefix when behind proxy_pass (#91)\n - Settings: Remove password link fix\n - Make sure right menu is still visible when URL is long\n - 0.38 release\n - Re #132 - Make a list of the JSONpath results instead of using only the first value\n - Customisable notifications (#123)\n - Re #117 - dont re-encode single value types, looks better in the diff\n - Usability tweak - [edit] on diff page should go back to diff page\n - Update README.md\n - Adding text about JSON API Monitoring\n - Re #117 Jsonpath based JSON change detection filter (#125)\n - Update README.md\n - Update README.md\n - Use right sticky for version\n - Re #118 - Make 'show current version' more obvious\n - Diff page - use the document title in <title> for better bookmarking\n - node-sass 6.0.1 works with node-sass watch way better\n - Updating inscriptis/text/html library to 1.2\n - Update readme with the branch link for javascript support\n - Updating trim-newlines packages\n\n - 0.37 release\n - #110 global recheck time (#113)\n - Re #106 - handling empty title with gettr cleanup (#107)\n - Update README.md\n - Auto extract html title as title (#102)\n - Bug fix - Check 'minutes_between_check' is set\n - tweak <pre> text wrapping when displaying diff\n - CSS Filter - Smarter is to just extract the HTML blob and continue with inscriptus, so we have almost the same output as not using the filter\n - CSS Filter - restore nicer linefeeds\n - @todo Comment - BS4's element.get_text() seems to lose the indentation format no-matter what\n - CSS Filter - strip text of whitespacing, preserve new lines where applicable, remove extra newlines\n - Include statistics for number of watches\n - Set edit-form for settings+watch to always be wide\n\n - Update README.md\n - 0.36\n - Re #42 - dont use blank titles\n - Re #100 - Fixing storage of minutes_between_check and adding automated test for field storage\n\n - 0.35\n - Time between rechecks is always stored as minutes\n - Ability to reset app password by placing a file called removepassword.lock into your data directory and restarting the instance\n - Adding tests for password control handling\n - Remove unused field (removepassword is actually a link)\n\n - 0.34\n - Be sure not to use blank passwords as the password\n - Re #42 - custom title (#98)\n - Re #92 - Re-use existing [preview] function for viewing current (#97)\n\n - 0.33\n - #81 - Regex support (#90)\n - Use wtforms handler (#96)\n - Re #95 - Include PUID/PGID example\n - re-enable tests\n - On settings submit, display saved message\n - Use flasks' built in 'flash' method instead of a custom message/notices (#94)\n - Adding rPi support info\n - Re #92 Adding link to CSS selector help in wiki\n - Re #93 - tweak build packages\n - Re #93, #79 - docker image multistage build lost the packages required for rPi etc\n - Strip surrounding whitespace from elements (#89)\n - Queue an entry for immediate recheck after [edit]\n - Adding helper method to remove text files that are not in the index\n - Fix typo\n - Re #88 - placeholder text on CSS rule\n - Re #86 - fix typo\n\n - 0.32 release\n - Sassify the diff page\n - "Sassify" the theme, easier to manage\n - Mobile fixes (#87)\n - Re #86 - Refactor scrub date limit code\n - Tweak comments\n - Re #77 - Repair and refactor time threshold check code\n - Modifies Dockerfile to use multistage builds (#79)\n - Bumping to 0.31\n\n - Re #75 - Adding test to confirm watched URL appears in RSS feed\n - CSS selector filter (#73)\n - Fixing var name\n - Include release metadata during github build\n - Update README.md\n - Re #40 Ability to set individual timers (#72)\n - Update README.md\n - Improvements for backup (#70)\n - Update README.md\n - Disable image layer cache service\n - Re-enable ARM v6/v7 builds\n - Install requirements, remove rust and dev packages that are no longer needed, hopefully for a smaller docker layer size\n - Remove rust build comments\n - Arm build fixes (#68)\n - Re #65 - Append BASE_URL env var to the notification if it is set (#66)\n - Update README.md\n - Adding BTC support instructions\n - Switch to just amd64 for now due to apprise not building on ARM\n - Fixing syntax\n - Re #49 Re #60 - Adding more information about proxy setup to README.md\n - Add socks proxy support (#60)\n - Created docker-compose file (#55)\n - Re #58 - reduce to 1 minute (a small rewrite is required to change the backend to store in 'seconds' instead of minutes)\n - 56 - Fix notification test\n - Update README.md\n - Update README.md\n - Adding rust compiler :(\n - trying without libssl and only libffi\n - Adding extra libs required for build\n - Cleanup docs\n - Tweak workflow (tests)\n\n - Security update\n - Apprise notifications (#43)\n - Fixing security update\n - Also detect pytest in the environ (for local debug)\n - Prepend 'test-' when runnning under pytest to guid\n - - Relabel login button - misc test cleanup\n - Re #46 - Add note to README.md about Javascript support\n - Bumping version\n - Re #45 - Set datastore path in app.config\n - Re #44 - Broke the menu by accident, adding tests and fixing.\n - bump to 0.29\n\n - docker-compose for dev not needed (use venv etc)\n - Password protection / login support (#34)\n - Update FUNDING.yml\n - Skip using tag limit on pause when no tag is being viewed\n - Pause/Unpause should respect limit tag on redirect\n - Validate duplicate URLs\n - Chdir is not needed because we add the file from the full path, but make it 'relative' in the Zip\n - Fix backup generation on relative paths (like when run outside docker, under venv, etc)\n - Adding noopener per CodeQL, stop pages from knowing the referer etc\n - Create codeql-analysis.yml\n - yarl not needed, lock requests version\n - dev packages needed, drop apt cache\n - See if we get a clean buildx without dev packages\n - Tweaking build size thanks to https://github.com/hadolint/hadolint\n - Adding dockerignore\n - Re #18 - Show "preview" of the page when only one revision exists (#33)\n - Update README.md\n - Update README.md\n - Also check that the watch is not paused before putting it into the checking queuex\n - revert c60be562718d23972d7d43821bb6b87f2add3256\n - remove extra packages (#32)\n\n - Bumping version to 0.28\n - Docker push amd64 rpi etc (#28)\n - Open [diff] links into their own window\n - Fix auto jump on viewing the diff\n - Re #30 - Delete history watch snapshots (#31)\n - Slow down the DB write interval and catch the case that it changed during write\n - Immediately 'jump' to the change\n - Tweak to hover pause icon\n - Stop runtime error on dict changing during write/init at start (#27)\n - Re #22 - ability to pause\n - Re #23 - always check value of interval time, not just on start\n - Update README.md\n - Use absolute image links so the screenshots work from docker hub\n - Update README.md\n - Updating screenshot\n - Reuse the GUID if we have one\n\n - Dont show 'empty' tag, it will be in the [ALL] list\n - Adding RSS feed icon\n - Generic object sync should use private method\n - Add missing urllib3\n - Add missing pytz\n - Check for new version\n - Fix import form flow logic\n - Code tidy/lint\n - Tidy up thread logic and version check\n - Add missing dep\n - Remove todos\n - Add icon for RSS, RSS should show only unviewed entries\n - Issue #7 - RSS feeds\n - Always override tag version (load from disk in future, so we can add it at build time)\n - next dev is 0.27\n - Tweak to tests\n - Move logic\n - Remove erroneous extra liveserver setup\n - When new ignore text is specified, reprocess the checksum\n - Adding filter and log output to pytest\n - Fix edit action link\n - Minor lint cleanup\n - Clean up after test case\n - Remove liveserver, doesnt belong here\n - Fix syntax, Triggers the workflow on push or pull request events\n - Activate workflow on all branches\n - Issue #14 - Tweaks to edit, create ignore text, tests for ignore text, integrate ignore text\n - Validation of added headers, should contain key/val (2 parts)\n - Issue #12 include version for easy reference.\n - Bring dev environment inline\n - Tidying up requirements.txt\n\n - Handle the case of someone supplying a bad link\n - Adding jump to next change diff widget\n - Moving nice screenshot to above the fold :)\n - Adding docker hub badge for tag information\n\n - Bumping schema tag to 0.25\n - Issue #5 - Remove arbitrary '600' minutes limit\n - Add test delay for github action test\n - Add wait for threads in test\n - Extending tests to cover resetting the diff/unviewed status correctly\n - Tidy up return logic\n - Code tidy\n - Fix docker app files paths\n - Tweaking Dockerfile for new eventlet wrapper\n - Create LICENSE\n - Adding docker pulls counter badge\n - Use master branch for badge\n - Removing unused import\n - Fixing a few more easy lint wins\n - Linting fixups\n - Update README.md\n - Add badge under pytest branch\n - Create python-app.yml\n - Create the test datastore\n - Minor cleanup\n - Just use the current/previous md5\n - Finalse pytest methods\n - Port should be an integer\n - Tweaking client\n - remove unused imports\n - Use session/client fixture\n - Addingmissing files\n - hack of pytest implementation - doesnt work yet\n - Tidy up a few broken datastore paths\n - WIP, separate out the Flask from everything else, get pytest working\n - Make records in the overview that have a difference that have not been viewed in the [diff] tab bold\n\n - Adding 0.24 tag\n - Avoid accidently using Python's objects that are copied - but land as a 'soft reference', need to use a better dict struct in the future #6\n - Minor fix to 'last changed' field, simplify template and logic\n - Remove debug print\n\n - Use a thread locker and cleaner separation of concerns between main thread and site status fetch\n\n - Adding tag to json\n - Adding SEND_FILE_MAX_AGE_DEFAULT to ensure backups etc dont get old\n - Minor fix - load extra stylesheet only once\n - Minor tweaks for development setup\n - Provide named containers and remove all existing\n - Adding new [Scrub All Version History] button under [settings] (But keep your URL list)\n - Flag for immediate sync of index after adding new watch\n - Sometimes it seems .update wasnt thread safe and isnt used here, just add a clean new dict member\n - Adding ARG to Dockerfile\n - Include the triggered build SHA as part of the backup info, when built in docker hub.\n - Add cache busting var to style sheets\n - Slightly more bulletproof instructions\n - Updating screenshot\n - Push newly created watches directly into the update check Queue.\n - Adding checkall\n - Easily download a full backup\n - Show the date/time of the current/most up to date version\n - Use a pool of thread workers, better for huge lists of watchers\n - Code cleanup edit submit handler can be the same function\n - Add update howto\n - Refactor slightly confusing difference build function\n - Version comparison had the wrong order\n - https://github.com/psf/requests/issues/4525 - brotli compression is not yet supported in requests, be sure that users cant accidently use this content type encoding in the headers\n\n - Include the current URL in the page when viewing the version diff\n - Include a selfcheck/diagnosis routine\n - On manual recheck request, redirect to same tag listing\n - Set default diff type to 'lines', faster for starters.\n - Supply different versions to browse\n - Fix heading\n - Update README.md\n - Adding diff screenshot\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n\n - Add more start-up examples\n - Tweak theming\n - Use a even simpler run command\n - improve the wording\n - Add basic settings page (so far just recheck time in minutes)\n - Updating README\n - Updating screenshot (new diff button)\n - Trigger write index after edit of a watch\n - Add [diff] mechanism\n - Use a single thread for writing the sync json\n - Use existing tag\n - When all items showed, show which tag it belongs to\n - Sort tag list\n - Set active tag selection\n - Support for comma separated tags\n - Tweak styling for 'new watch' form\n - Remove import for old lib\n - Switch to inscriptis prepare config backend struct\n - Support for custom headers per watch\n - Going back to larger PNG screenshot, looks better in Github :)\n - Fix alt text in markup\n - Adding new screenshot binary\n - Updating screenshot\n - Moving start text to a more visible part\n - Tweak messages\n - Change message text\n - Fixing messages styling\n - Basic tag browse buttons\n - Bulk import\n - Tidy up 'last_checked' date handling\n - Dev environment setup\n - Dev docker tweaks\n - Remove messy text\n - Tweaking text\n - Fixing checkall hook\n - Use requests's r.text so we dont have to deal with charsets\n - Add note\n - Fix bad copy command\n - Oops left out the image name\n - Fix build setup for the docker hub image https://hub.docker.com/r/dgtlmoon/changedetection.io\n - Update screenshot\n - Add edit UI Move to keyed structure instead of list\n - Fixes to CSS\n - Add method to launch a full recheck of all @note - needs to be converted to a python Queue threads\n - Tweaks to docker layout\n - Remove actual :// links, dont consider these as part of the changes, often they include variables/trackingscript ref etc\n - Create FUNDING.yml\n\n - Specify image name in docker files to avoid a confusing build/run\n - Tidy up devel docker\n - Tweak comments\n - Avoid recasting the type\n - Store a history of changes, used for future lookup/diff/explore changes UI\n - Update README.md\n - Show the backend error in the table if there is one\n - Include screenshot\n - Fix branch name\n - Tweak todo\n - Adding README amd docker info\n - Add missing file\n - Primitive support for extra headers\n - remove debug\n - Handle titles and links\n - Fix base definition of the watcher\n - sort by last changed\n - fix button size\n - Store the html2text version too\n - fix favicon\n - small fixes\n - Handle errors better, use the plaintext output\n - Workon threads\n - WIP\n - Remove nocache experimental\n - Initial commit\n\n", "preview_url": "https://changedetection.n8n-cloud.website/preview/72b4e58e-c3b3-4747-b20f-aed2073d0e67", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "72b4e58e-c3b3-4747-b20f-aed2073d0e67", "watch_mime_type": "text/plain", "watch_tag": "changedetection.io", "watch_title": "https://changedetection.io/CHANGELOG.txt", "watch_url": "https://changedetection.io/CHANGELOG.txt", "watch_uuid": "72b4e58e-c3b3-4747-b20f-aed2073d0e67", "notification_urls": ["tgram://8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/500917782/?format=text"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\n---\n{{diff}}\n---\n", "notification_format": "htmlcolor", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changedetection.n8n-cloud.website/edit/72b4e58e-c3b3-4747-b20f-aed2073d0e67"}}]
- Sat Oct 3 10:38:58 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Can\'t find end tag corresponding to start tag \\"s\\""}'
- 2026-10-03 10:38:58,985 - DEBUG - Response Details:
- 2026-10-03 10:38:58,984 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Can't find end tag corresponding to start tag "s", error=400.
- 2026-10-03 10:38:58,912 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://news.ycombinator.com/\r\nhttps://news.ycombinator.com/ had a change.\n---\n<s> 1. Newgrounds.com – A community of games, music, and art ( newgrounds.com )</s>\n<s> 126 points by azhenley 4 hours ago | hide | 32 comments</s>\n<s></s>\n<s> 2. Extra Big Ass Intelligence ( extrabigassintelligence.com )</s>\n<s> 58 points by 34679 2 hours ago | hide | 9 comments</s>\n<s></s>\n<s> 3. The Forgetful CPU (Linux on M4) ( yuka.dev )</s>\n<s> 167 points by signa11 7 hours ago | hide | 81 comments</s>\n<b> 1. Extra Big Ass Intelligence ( extrabigassintelligence.com )</b>\n<b> 260 points by 34679 5 hours ago | hide | 57 comments</b>\n<b></b>\n<b> 2. Understanding Frontier Artificial Intelligence ( casp.ac )</b>\n<b> 18 points by roversx 1 hour ago | hide | 8 comments</b>\n<b></b>\n<b> 3. Newgrounds.com – A community of games, music, and art ( newgrounds.com )</b>\n<b> 193 points by azhenley 7 hours ago | hide | 55 comments</b>\n<s> 577 points by hn_acker 16 hours ago | hide | 255 comments</s>\n<s></s>\n<s> 5. &nbs', 'chat_id': 500917782}
- 2026-10-03 10:38:58,912 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-03 10:38:58,911 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream
- Sat Oct 3 10:20:37 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Unclosed end tag at byte offset 3600"}'
- 2026-10-03 10:20:37,749 - DEBUG - Response Details:
- 2026-10-03 10:20:37,749 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Unclosed end tag at byte offset 3600, error=400.
- 2026-10-03 10:20:37,655 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://changedetection.io/CHANGELOG.txt\r\nhttps://changedetection.io/CHANGELOG.txt had a change.\n---\n<s>HEAD / 2026-09-12 17:48:48 +0200:</s>\n<b>HEAD / 2026-10-02 07:59:10 +0200:</b>\n<b> - Update pytest requirement from ~=9.0 to ~=9.1 (#4504)</b>\n<b> - Restock & Price detection - Fix decimal-comma prices ("39,99") being read as 3999 (#4493) (#4494), Warning: Could change previous values that were wrongly stored as 4999 -> 49.99 for example</b>\n<b> - i18n: Add ja translations for new UI (part 2) (#4491)</b>\n<b></b>\n<b> - 0.60.8</b>\n<b> - i18n: Fix untranslated labels (#4488)</b>\n<b> - Use `lazy_pgettext` for condition Match label (#4480)</b>\n<b> - Title extract - Limit search window and improve regex - reduce memory usage (#4487)</b>\n<b> - LLM - Disable by default the fetching of price mappings from GitHub on startup</b>\n<b> - UI - CSS cleanups in LLM settings area</b>\n<b> - Update python-socketio requirement from <6,>=5.11.0 to >=5.17.0,<6 (#4486)</b>\n<b> - Update flask-wtf requirement from ~=1.2 to ~=1.3 (#4485)</b>\n<b> - UI - CSS - Mobile - Just remove disabled items, cleaner output.</b>\n<b> - UI - CSS - Mobile - Fixing padding on edit pages</b>\n<b> - UI - CSS - Mobile - Add little home button at top</b>\n<b> - UI - CSS - Mobile improvements</b>\n<b> - LLM - History/difference page - CSRF fix for LLM summary fetching between versions</b>\n<b> - Update selenium requirement from ~=4.31.0 to ~=4.49.0 (#4456)</b>\n<b> - Our first basic PWA mobile integration! Look for the QR-Code in Settings (#4472)</b>\n<b> - UI - Prevent accidental change of LLM Key (#4473)</b>\n<b> - LLM - Fixes for temperature/reasoning GPT-5 etc</b>\n<b> - LLM - UI nonblocking (#4469)</b>\n<b> - LLM timeout improvements (frontend) (#4470)</b>\n<b> - LLM UI - When LLM is disabled, hide it from the groups settings also (#4471)</b>\n<b> - Make LLM summary from UI non blocking (#4467)</b>\n<b> - Groups - UI fix for #4451 and tweaks (#4466)</b>\n<b> - UI - LLM - Tidy up styling</b>\n<b> - UI: make editing a configured LLM model discoverable (#4400)</b>\n<b> - i18n: Add ja translations for new UI (#4464)</b>\n<b> - i18n: Use `msgctxt` and correct ja translations for -ed forms (#4460)</b>\n<b> - UI - sidebar - background fixes</b>\n<b> - Update chardet requirement from >2.3.0 to >=7.6.0 (#4455)</b>\n<b> - System - Ensure import+API update values are verified types (#4458)</b>\n<b> - UI - Horizontal lines and styling fixes for #4424</b>\n<b> - UI - Sidebar spacing/colour fixes</b>\n<b> - UI - Styling - Remove background on sidebar, more contrast is easier on the eyes</b>\n<b> - API - Rebuild docs</b>\n<b> - UI - Set language on reverse proxy/subdirectory hosting was acting wrong, just redirect it to watchlist so theres no failures. (#4453)</b>\n<b> - UI - CSS - Mobile misc fixes</b>\n<b> - Update stock-not-in-stock.js - spanish</b>\n<b> - Docs - Adding price graph/restock info</b>\n<b> - Adding HTTP browser caching of UI elements (#4450)</b>\n<b></b>\n<b> - 0.60.7</b>\n<b> - Set Cache-Control: no-store on dynamic responses by default (#4319)</b>\n<b> - UI - Make the 'share watch' optional, reduces visual noise, not really used by non-power users (#4448)</b>\n<b> - UI - CSS - Header menu item color fix</b>\n<b> - UI - Watch list - Move processor/mode to its own column</b>\n<b> - UI - Watchlist - Better alignment and icons</b>\n<b> - UI - Diff page - tabs should be consistent size with rest of app</b>\n<b> - UI - Watch list - Tidy up padding between cells</b>\n<b> - fix(http): send a single Date header on werkzeug built-in server (#4372)</', 'chat_id': 500917782}
- 2026-10-03 10:20:37,655 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-03 10:20:37,654 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream
- Sat Oct 3 07:38:58 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Can\'t find end tag corresponding to start tag \\"s\\""}'
- 2026-10-03 07:38:58,253 - DEBUG - Response Details:
- 2026-10-03 07:38:58,253 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Can't find end tag corresponding to start tag "s", error=400.
- 2026-10-03 07:38:58,171 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://news.ycombinator.com/\r\nhttps://news.ycombinator.com/ had a change.\n---\n<s> 1. Things That Apparently Cause Cancer ( breakthroughjournal.org )</s>\n<s> 79 points by timpera 2 hours ago | hide | 31 comments</s>\n<s></s>\n<s> 2. The Forgetful CPU (Linux on M4) ( yuka.dev )</s>\n<s> 118 points by signa11 4 hours ago | hide | 44 comments</s>\n<s></s>\n<s> 3. Court agrees with EFF: Utah's VPN law demands a technical impossibility ( eff.org )</s>\n<s> 525 points by hn_acker 13 hours ago | hide | 232 comments</s>\n<s></s>\n<s> 4. Mike Tomlin spent 12 years building a Minecraft city ( nytimes.com )</s>\n<s> 308 points by CoryOndrejka 9 hours ago | hide | 83 comments</s>\n<s></s>\n<s> 5. A 12-year sequence of telescope images of a star and four planets orbiting ( bsky.app/theplanetaryguy.com )</s>\n<s> 203 points by mariuz 8 hours ago | hide | 49 comments</s>\n<s></s>\n<s> 6. Apple Pass Designer ( developer.apple.com )</s>\n<s> 329 points by soheilpro 7 hours ago | hide | 221 comments</s>\n<s></s>\n<s> 7. &n', 'chat_id': 500917782}
- 2026-10-03 07:38:58,171 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-03 07:38:58,170 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream
- Sat Oct 3 04:38:57 2026 - SENDING - [{"title": "ChangeDetection.io Notification - https://news.ycombinator.com/", "body": "https://news.ycombinator.com/ had a change.\n---\n<s> 1. <input type="password" maxlength="20"> prevents me from logging into Vanguard ( nanakorn.com )</s>\n<s> 13 points by tanin 19 minutes ago | hide | 6 comments</s>\n<s></s>\n<s> 2. Apple Pass Designer ( developer.apple.com )</s>\n<s> 270 points by soheilpro 4 hours ago | hide | 189 comments</s>\n<s></s>\n<s> 3. Court agrees with EFF: Utah's VPN law demands a technical impossibility ( eff.org )</s>\n<s> 445 points by hn_acker 10 hours ago | hide | 196 comments</s>\n<s></s>\n<s> 4. A 12-year sequence of telescope images of a star and four planets orbiting ( bsky.app/theplanetaryguy.com )</s>\n<s> 160 points by mariuz 5 hours ago | hide | 33 comments</s>\n<s></s>\n<s> 5. With most information hidden, the game Stratego had stumped AI until now ( arstechnica.com )</s>\n<s> 150 points by PaulHoule 6 hours ago | hide | 73 comments</s>\n<s></s>\n<s> 6. Muse Gadgets ( muse.ai )</s>\n<s> 85 points by anant 4 hours ago | hide | 45 comments</s>\n<s></s>", "url": "tgram://8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/500917782/?format=text&avatar_url=https://raw.githubusercontent.com/dgtlmoon/changedetection.io/master/changedetectionio/static/images/avatar-256x256.png", "original_context": {"base_url": "https://changedetection.n8n-cloud.website/", "change_datetime": "2026-10-03 04:38:57 CEST", "current_snapshot": " Hacker Newsnew | past | comments | ask | show | jobs | submit login \n \n\n 1. Things That Apparently Cause Cancer ( breakthroughjournal.org ) \n 79 points by timpera 2 hours ago | hide | 31 comments \n \n 2. The Forgetful CPU (Linux on M4) ( yuka.dev ) \n 118 points by signa11 4 hours ago | hide | 44 comments \n \n 3. Court agrees with EFF: Utah's VPN law demands a technical impossibility ( eff.org ) \n 525 points by hn_acker 13 hours ago | hide | 232 comments \n \n 4. Mike Tomlin spent 12 years building a Minecraft city ( nytimes.com ) \n 308 points by CoryOndrejka 9 hours ago | hide | 83 comments \n \n 5. A 12-year sequence of telescope images of a star and four planets orbiting ( bsky.app/theplanetaryguy.com )\n 203 points by mariuz 8 hours ago | hide | 49 comments \n \n 6. Apple Pass Designer ( developer.apple.com ) \n 329 points by soheilpro 7 hours ago | hide | 221 comments \n \n 7. NTSB Preliminary Report: Prime Air 767 Runway Overrun [pdf] ( ntsb.gov ) \n 15 points by sdko 1 hour ago | hide | 7 comments \n \n 8. Newgrounds.com \u2013 A community of games, music, and art ( newgrounds.com ) \n 12 points by azhenley 1 hour ago | hide | discuss \n \n 9. With most information hidden, the game Stratego had stumped AI until now ( arstechnica.com ) \n 188 points by PaulHoule 9 hours ago | hide | 91 comments \n \n10. Muse Gadgets ( muse.ai ) \n 138 points by anant 7 hours ago | hide | 67 comments \n \n11. Loss of cell identity drives human aging: Two new papers ( erictopol.substack.com ) \n 181 points by bookofjoe 10 hours ago | hide | 48 comments \n \n12. Hair Loss Was Just the Start. Ozempic Users Are Also Reporting Nail Trouble ( gizmodo.com ) \n 43 points by gumby 1 hour ago | hide | 28 comments \n \n13. From the creator of Redis; run LLM locally with ds4 ( dwarfstar.sh ) \n 160 points by fibo 8 hours ago | hide | 40 comments \n \n14. Greg Kroah-Hartman \u2013 Security in the LLM Age [video] ( youtube.com ) \n 183 points by usernomdeguerre 9 hours ago | hide | 49 comments \n \n15. Updates to Full Disk Access in macOS ( developer.apple.com ) \n 133 points by notfirstpost 7 hours ago | hide | 76 comments \n \n16. FLUX 3 Image ( bfl.ai ) \n 279 points by minimaxir 13 hours ago | hide | 62 comments \n \n17. Sites in ChatGPT ( chatgpt.com ) \n 220 points by polvi 11 hours ago | hide | 220 comments \n \n18. Billions of Triangles Redux ( zeux.io ) \n 13 points by ibobev 3 hours ago | hide | discuss \n \n19. Every SaaS business will become a harness around a model ( sshh.io ) \n 104 points by iacguy 5 hours ago | hide | 75 comments \n \n20. Show HN: Made an open-source Lego AI generator ( github.com/anteloc ) \n 73 points by antelocnova 6 hours ago | hide | 41 comments \n \n21. Venice\u2019s failed war against Constantinople led to the first bond market ( bigthink.com ) \n 80 points by RickJWagner 8 hours ago | hide | 24 comments \n \n22. Show HN: Giving Opus 5.5 a simulated paint canvas ( stillwet.art ) \n 208 points by alstonite 13 hours ago | hide | 68 comments \n \n23. The Legend of von Neumann (1973) [pdf] ( gwern.net ) \n 246 points by suopspaces 13 hours ago | hide | 141 comments \n \n24. One month coding with GLM 5.3 Flash ( wagtail.org ) \n 119 points by ThibWeb 8 hours ago | hide | 91 comments \n \n25. Anatomy of a Lean proof for software engineers ( agostbiro.net ) \n 84 points by abiro 8 hours ago | hide | 15 comments \n \n26. Where Is the Planet ( whereistheplanet.com ) \n 9 points by andsoitis 2 hours ago | hide | discuss \n \n27. Our Project Suncatcher prototype satellite is in orbit ( blog.google ) \n 48 points by pantalaimon 8 hours ago | hide | 51 comments \n \n28. Blogging with Gleam, Org-Mode and Pandoc ( byzantine-systems.github.io ) \n 61 points by schonfinkel 8 hours ago | hide | 13 comments \n \n29. The first packet sent via RFC1149 avian carrier is up for auction at Christie's ( christies.com ) \n 47 points by peter_hansteen 8 hours ago | hide | 11 comments \n \n30. Show HN: Pyxel \u2013 A Python retro game engine with built-in art and sound editors ( github.com/kitao ) \n 71 points by kitao 9 hours ago | hide | 8 comments \n \n \n More \n \n \n \n \nConsider applying for YC's Winter 2027 batch! Applications are open till November 2. \nGuidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact \n \nSearch: \n", "diff": "@changed_PLACEMARKER_OPEN 1. <input type="password" maxlength="20"> prevents me from logging into Vanguard ( nanakorn.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 13 points by tanin 19 minutes ago | hide | 6 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 2. Apple Pass Designer ( developer.apple.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 270 points by soheilpro 4 hours ago | hide | 189 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 3. Court agrees with EFF: Utah's VPN law demands a technical impossibility ( eff.org )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 445 points by hn_acker 10 hours ago | hide | 196 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 4. A 12-year sequence of telescope images of a star and four planets orbiting ( bsky.app/theplanetaryguy.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 160 points by mariuz 5 hours ago | hide | 33 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 5. With most information hidden, the game Stratego had stumped AI until now ( arstechnica.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 150 points by PaulHoule 6 hours ago | hide | 73 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 6. Muse Gadgets ( muse.ai )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 85 points by anant 4 hours ago | hide | 45 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 7. Mike Tomlin spent 12 years building a Minecraft city ( nytimes.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 188 points by CoryOndrejka 6 hours ago | hide | 52 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 8. Loss of cell identity drives human aging: Two new papers ( erictopol.substack.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 149 points by bookofjoe 7 hours ago | hide | 37 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 9. Zig v0.17.0 ( ziglang.org )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 177 points by ErenayDev 2 hours ago | hide | 91 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN10. The Forgetful CPU (Linux on M4) ( yuka.dev )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 20 points by signa11 1 hour ago | hide | discuss@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN11. One month coding with GLM 5.3 Flash ( wagtail.org )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 90 points by ThibWeb 5 hours ago | hide | 70 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN12. From the creator of Redis; run LLM locally with ds4 ( dwarfstar.sh )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 119 points by fibo 5 hours ago | hide | 35 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN13. Greg Kroah-Hartman \u2013 Security in the LLM Age [video] ( youtube.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 157 points by usernomdeguerre 6 hours ago | hide | 32 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN14. Show HN: Made an open-source Lego AI generator ( github.com/anteloc )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 54 points by antelocnova 3 hours ago | hide | 35 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN15. Every SaaS business will become a harness around a model ( sshh.io )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 68 points by iacguy 2 hours ago | hide | 51 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN16. Updates to Full Disk Access in macOS ( developer.apple.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 78 points by notfirstpost 4 hours ago | hide | 54 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN17. Open-sourcing AstaBrief, the fast report-generation model in Asta ( allenai.org )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 12 points by malshe 2 hours ago | hide | discuss@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN18. Sites in ChatGPT ( chatgpt.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 186 points by polvi 8 hours ago | hide | 204 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN19. FLUX 3 Image ( bfl.ai )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 252 points by minimaxir 10 hours ago | hide | 57 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN20. Venice\u2019s failed war against Constantinople led to the first bond market ( bigthink.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 56 points by RickJWagner 5 hours ago | hide | 19 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN21. Blogging with Gleam, Org-Mode and Pandoc ( byzantine-systems.github.io )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 44 points by schonfinkel 5 hours ago | hide | 9 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN22. Anatomy of a Lean proof for software engineers ( agostbiro.net )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 68 points by abiro 5 hours ago | hide | 6 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN23. The Legend of von Neumann (1973) [pdf] ( gwern.net )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 232 points by suopspaces 10 hours ago | hide | 135 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN24. Show HN: Giving Opus 5.5 a simulated paint canvas ( stillwet.art )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 179 points by alstonite 10 hours ago | hide | 59 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN25. STS-51-F Abort-to-Orbit (1985) ( wikipedia.org )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 32 points by schoen 4 hours ago | hide | 9 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN26. The first packet sent via RFC1149 avian carrier is up for auction at Christie's ( christies.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 33 points by peter_hansteen 5 hours ago | hide | 3 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN27. F.02 Decommission ( figure.ai )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 51 points by ad_hockey 5 hours ago | hide | 18 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN28. Show HN: Pyxel \u2013 A Python retro game engine with built-in art and sound editors ( github.com/kitao )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 56 points by kitao 6 hours ago | hide | 6 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN29. What if we stopped using GPUs? [video] ( youtube.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 35 points by sandslash 5 hours ago | hide | 8 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN30. On social reality in China ( lesswrong.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 124 points by thicTurtlLverXX 6 hours ago | hide | 126 comments@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 1. Things That Apparently Cause Cancer ( breakthroughjournal.org )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 79 points by timpera 2 hours ago | hide | 31 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 2. The Forgetful CPU (Linux on M4) ( yuka.dev )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 118 points by signa11 4 hours ago | hide | 44 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 3. Court agrees with EFF: Utah's VPN law demands a technical impossibility ( eff.org )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 525 points by hn_acker 13 hours ago | hide | 232 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 4. Mike Tomlin spent 12 years building a Minecraft city ( nytimes.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 308 points by CoryOndrejka 9 hours ago | hide | 83 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 5. A 12-year sequence of telescope images of a star and four planets orbiting ( bsky.app/theplanetaryguy.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 203 points by mariuz 8 hours ago | hide | 49 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 6. Apple Pass Designer ( developer.apple.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 329 points by soheilpro 7 hours ago | hide | 221 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 7. NTSB Preliminary Report: Prime Air 767 Runway Overrun [pdf] ( ntsb.gov )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 15 points by sdko 1 hour ago | hide | 7 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 8. Newgrounds.com \u2013 A community of games, music, and art ( newgrounds.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 12 points by azhenley 1 hour ago | hide | discuss@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 9. With most information hidden, the game Stratego had stumped AI until now ( arstechnica.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 188 points by PaulHoule 9 hours ago | hide | 91 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN10. Muse Gadgets ( muse.ai )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 138 points by anant 7 hours ago | hide | 67 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN11. Loss of cell identity drives human aging: Two new papers ( erictopol.substack.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 181 points by bookofjoe 10 hours ago | hide | 48 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN12. Hair Loss Was Just the Start. Ozempic Users Are Also Reporting Nail Trouble ( gizmodo.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 43 points by gumby 1 hour ago | hide | 28 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN13. From the creator of Redis; run LLM locally with ds4 ( dwarfstar.sh )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 160 points by fibo 8 hours ago | hide | 40 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN14. Greg Kroah-Hartman \u2013 Security in the LLM Age [video] ( youtube.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 183 points by usernomdeguerre 9 hours ago | hide | 49 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN15. Updates to Full Disk Access in macOS ( developer.apple.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 133 points by notfirstpost 7 hours ago | hide | 76 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN16. FLUX 3 Image ( bfl.ai )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 279 points by minimaxir 13 hours ago | hide | 62 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN17. Sites in ChatGPT ( chatgpt.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 220 points by polvi 11 hours ago | hide | 220 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN18. Billions of Triangles Redux ( zeux.io )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 13 points by ibobev 3 hours ago | hide | discuss@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN19. Every SaaS business will become a harness around a model ( sshh.io )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 104 points by iacguy 5 hours ago | hide | 75 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN20. Show HN: Made an open-source Lego AI generator ( github.com/anteloc )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 73 points by antelocnova 6 hours ago | hide | 41 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN21. Venice\u2019s failed war against Constantinople led to the first bond market ( bigthink.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 80 points by RickJWagner 8 hours ago | hide | 24 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN22. Show HN: Giving Opus 5.5 a simulated paint canvas ( stillwet.art )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 208 points by alstonite 13 hours ago | hide | 68 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN23. The Legend of von Neumann (1973) [pdf] ( gwern.net )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 246 points by suopspaces 13 hours ago | hide | 141 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN24. One month coding with GLM 5.3 Flash ( wagtail.org )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 119 points by ThibWeb 8 hours ago | hide | 91 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN25. Anatomy of a Lean proof for software engineers ( agostbiro.net )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 84 points by abiro 8 hours ago | hide | 15 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN26. Where Is the Planet ( whereistheplanet.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 9 points by andsoitis 2 hours ago | hide | discuss@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN27. Our Project Suncatcher prototype satellite is in orbit ( blog.google )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 48 points by pantalaimon 8 hours ago | hide | 51 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN28. Blogging with Gleam, Org-Mode and Pandoc ( byzantine-systems.github.io )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 61 points by schonfinkel 8 hours ago | hide | 13 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN29. The first packet sent via RFC1149 avian carrier is up for auction at Christie's ( christies.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 47 points by peter_hansteen 8 hours ago | hide | 11 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN30. Show HN: Pyxel \u2013 A Python retro game engine with built-in art and sound editors ( github.com/kitao )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 71 points by kitao 9 hours ago | hide | 8 comments@changed_into_PLACEMARKER_CLOSED", "diff_clean": "", "diff_added": "", "diff_added_clean": "", "diff_full": "", "diff_full_clean": "", "diff_patch": "", "diff_removed": "", "diff_removed_clean": "", "diff_changed_from": "", "diff_changed_to": "", "diff_url": "https://changedetection.n8n-cloud.website/diff/6070e6a4-6bda-4687-acbb-a1994f9f29d8", "raw_diff": "@changed_PLACEMARKER_OPEN 1. <input type="password" maxlength="20"> prevents me from logging into Vanguard ( nanakorn.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 13 points by tanin 19 minutes ago | hide | 6 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 2. Apple Pass Designer ( developer.apple.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 270 points by soheilpro 4 hours ago | hide | 189 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 3. Court agrees with EFF: Utah's VPN law demands a technical impossibility ( eff.org )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 445 points by hn_acker 10 hours ago | hide | 196 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 4. A 12-year sequence of telescope images of a star and four planets orbiting ( bsky.app/theplanetaryguy.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 160 points by mariuz 5 hours ago | hide | 33 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 5. With most information hidden, the game Stratego had stumped AI until now ( arstechnica.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 150 points by PaulHoule 6 hours ago | hide | 73 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 6. Muse Gadgets ( muse.ai )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 85 points by anant 4 hours ago | hide | 45 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 7. Mike Tomlin spent 12 years building a Minecraft city ( nytimes.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 188 points by CoryOndrejka 6 hours ago | hide | 52 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 8. Loss of cell identity drives human aging: Two new papers ( erictopol.substack.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 149 points by bookofjoe 7 hours ago | hide | 37 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 9. Zig v0.17.0 ( ziglang.org )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 177 points by ErenayDev 2 hours ago | hide | 91 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN10. The Forgetful CPU (Linux on M4) ( yuka.dev )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 20 points by signa11 1 hour ago | hide | discuss@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN11. One month coding with GLM 5.3 Flash ( wagtail.org )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 90 points by ThibWeb 5 hours ago | hide | 70 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN12. From the creator of Redis; run LLM locally with ds4 ( dwarfstar.sh )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 119 points by fibo 5 hours ago | hide | 35 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN13. Greg Kroah-Hartman \u2013 Security in the LLM Age [video] ( youtube.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 157 points by usernomdeguerre 6 hours ago | hide | 32 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN14. Show HN: Made an open-source Lego AI generator ( github.com/anteloc )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 54 points by antelocnova 3 hours ago | hide | 35 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN15. Every SaaS business will become a harness around a model ( sshh.io )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 68 points by iacguy 2 hours ago | hide | 51 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN16. Updates to Full Disk Access in macOS ( developer.apple.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 78 points by notfirstpost 4 hours ago | hide | 54 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN17. Open-sourcing AstaBrief, the fast report-generation model in Asta ( allenai.org )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 12 points by malshe 2 hours ago | hide | discuss@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN18. Sites in ChatGPT ( chatgpt.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 186 points by polvi 8 hours ago | hide | 204 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN19. FLUX 3 Image ( bfl.ai )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 252 points by minimaxir 10 hours ago | hide | 57 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN20. Venice\u2019s failed war against Constantinople led to the first bond market ( bigthink.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 56 points by RickJWagner 5 hours ago | hide | 19 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN21. Blogging with Gleam, Org-Mode and Pandoc ( byzantine-systems.github.io )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 44 points by schonfinkel 5 hours ago | hide | 9 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN22. Anatomy of a Lean proof for software engineers ( agostbiro.net )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 68 points by abiro 5 hours ago | hide | 6 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN23. The Legend of von Neumann (1973) [pdf] ( gwern.net )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 232 points by suopspaces 10 hours ago | hide | 135 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN24. Show HN: Giving Opus 5.5 a simulated paint canvas ( stillwet.art )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 179 points by alstonite 10 hours ago | hide | 59 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN25. STS-51-F Abort-to-Orbit (1985) ( wikipedia.org )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 32 points by schoen 4 hours ago | hide | 9 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN26. The first packet sent via RFC1149 avian carrier is up for auction at Christie's ( christies.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 33 points by peter_hansteen 5 hours ago | hide | 3 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN27. F.02 Decommission ( figure.ai )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 51 points by ad_hockey 5 hours ago | hide | 18 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN28. Show HN: Pyxel \u2013 A Python retro game engine with built-in art and sound editors ( github.com/kitao )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 56 points by kitao 6 hours ago | hide | 6 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN29. What if we stopped using GPUs? [video] ( youtube.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 35 points by sandslash 5 hours ago | hide | 8 comments@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN30. On social reality in China ( lesswrong.com )@changed_PLACEMARKER_CLOSED\n@changed_PLACEMARKER_OPEN 124 points by thicTurtlLverXX 6 hours ago | hide | 126 comments@changed_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 1. Things That Apparently Cause Cancer ( breakthroughjournal.org )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 79 points by timpera 2 hours ago | hide | 31 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 2. The Forgetful CPU (Linux on M4) ( yuka.dev )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 118 points by signa11 4 hours ago | hide | 44 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 3. Court agrees with EFF: Utah's VPN law demands a technical impossibility ( eff.org )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 525 points by hn_acker 13 hours ago | hide | 232 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 4. Mike Tomlin spent 12 years building a Minecraft city ( nytimes.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 308 points by CoryOndrejka 9 hours ago | hide | 83 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 5. A 12-year sequence of telescope images of a star and four planets orbiting ( bsky.app/theplanetaryguy.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 203 points by mariuz 8 hours ago | hide | 49 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 6. Apple Pass Designer ( developer.apple.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 329 points by soheilpro 7 hours ago | hide | 221 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 7. NTSB Preliminary Report: Prime Air 767 Runway Overrun [pdf] ( ntsb.gov )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 15 points by sdko 1 hour ago | hide | 7 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 8. Newgrounds.com \u2013 A community of games, music, and art ( newgrounds.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 12 points by azhenley 1 hour ago | hide | discuss@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 9. With most information hidden, the game Stratego had stumped AI until now ( arstechnica.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 188 points by PaulHoule 9 hours ago | hide | 91 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN10. Muse Gadgets ( muse.ai )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 138 points by anant 7 hours ago | hide | 67 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN11. Loss of cell identity drives human aging: Two new papers ( erictopol.substack.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 181 points by bookofjoe 10 hours ago | hide | 48 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN12. Hair Loss Was Just the Start. Ozempic Users Are Also Reporting Nail Trouble ( gizmodo.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 43 points by gumby 1 hour ago | hide | 28 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN13. From the creator of Redis; run LLM locally with ds4 ( dwarfstar.sh )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 160 points by fibo 8 hours ago | hide | 40 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN14. Greg Kroah-Hartman \u2013 Security in the LLM Age [video] ( youtube.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 183 points by usernomdeguerre 9 hours ago | hide | 49 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN15. Updates to Full Disk Access in macOS ( developer.apple.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 133 points by notfirstpost 7 hours ago | hide | 76 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN16. FLUX 3 Image ( bfl.ai )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 279 points by minimaxir 13 hours ago | hide | 62 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN17. Sites in ChatGPT ( chatgpt.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 220 points by polvi 11 hours ago | hide | 220 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN18. Billions of Triangles Redux ( zeux.io )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 13 points by ibobev 3 hours ago | hide | discuss@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN19. Every SaaS business will become a harness around a model ( sshh.io )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 104 points by iacguy 5 hours ago | hide | 75 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN20. Show HN: Made an open-source Lego AI generator ( github.com/anteloc )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 73 points by antelocnova 6 hours ago | hide | 41 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN21. Venice\u2019s failed war against Constantinople led to the first bond market ( bigthink.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 80 points by RickJWagner 8 hours ago | hide | 24 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN22. Show HN: Giving Opus 5.5 a simulated paint canvas ( stillwet.art )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 208 points by alstonite 13 hours ago | hide | 68 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN23. The Legend of von Neumann (1973) [pdf] ( gwern.net )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 246 points by suopspaces 13 hours ago | hide | 141 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN24. One month coding with GLM 5.3 Flash ( wagtail.org )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 119 points by ThibWeb 8 hours ago | hide | 91 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN25. Anatomy of a Lean proof for software engineers ( agostbiro.net )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 84 points by abiro 8 hours ago | hide | 15 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN26. Where Is the Planet ( whereistheplanet.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 9 points by andsoitis 2 hours ago | hide | discuss@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN27. Our Project Suncatcher prototype satellite is in orbit ( blog.google )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 48 points by pantalaimon 8 hours ago | hide | 51 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN28. Blogging with Gleam, Org-Mode and Pandoc ( byzantine-systems.github.io )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 61 points by schonfinkel 8 hours ago | hide | 13 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN29. The first packet sent via RFC1149 avian carrier is up for auction at Christie's ( christies.com )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 47 points by peter_hansteen 8 hours ago | hide | 11 comments@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN30. Show HN: Pyxel \u2013 A Python retro game engine with built-in art and sound editors ( github.com/kitao )@changed_into_PLACEMARKER_CLOSED\n@changed_into_PLACEMARKER_OPEN 71 points by kitao 9 hours ago | hide | 8 comments@changed_into_PLACEMARKER_CLOSED", "markup_text_links_to_html_links": false, "restock": {}, "notification_timestamp": 1790995137.4136043, "prev_snapshot": " Hacker Newsnew | past | comments | ask | show | jobs | submit login \n \n\n 1. <input type="password" maxlength="20"> prevents me from logging into Vanguard ( nanakorn.com ) \n 13 points by tanin 19 minutes ago | hide | 6 comments \n \n 2. Apple Pass Designer ( developer.apple.com ) \n 270 points by soheilpro 4 hours ago | hide | 189 comments \n \n 3. Court agrees with EFF: Utah's VPN law demands a technical impossibility ( eff.org ) \n 445 points by hn_acker 10 hours ago | hide | 196 comments \n \n 4. A 12-year sequence of telescope images of a star and four planets orbiting ( bsky.app/theplanetaryguy.com )\n 160 points by mariuz 5 hours ago | hide | 33 comments \n \n 5. With most information hidden, the game Stratego had stumped AI until now ( arstechnica.com ) \n 150 points by PaulHoule 6 hours ago | hide | 73 comments \n \n 6. Muse Gadgets ( muse.ai ) \n 85 points by anant 4 hours ago | hide | 45 comments \n \n 7. Mike Tomlin spent 12 years building a Minecraft city ( nytimes.com ) \n 188 points by CoryOndrejka 6 hours ago | hide | 52 comments \n \n 8. Loss of cell identity drives human aging: Two new papers ( erictopol.substack.com ) \n 149 points by bookofjoe 7 hours ago | hide | 37 comments \n \n 9. Zig v0.17.0 ( ziglang.org ) \n 177 points by ErenayDev 2 hours ago | hide | 91 comments \n \n10. The Forgetful CPU (Linux on M4) ( yuka.dev ) \n 20 points by signa11 1 hour ago | hide | discuss \n \n11. One month coding with GLM 5.3 Flash ( wagtail.org ) \n 90 points by ThibWeb 5 hours ago | hide | 70 comments \n \n12. From the creator of Redis; run LLM locally with ds4 ( dwarfstar.sh ) \n 119 points by fibo 5 hours ago | hide | 35 comments \n \n13. Greg Kroah-Hartman \u2013 Security in the LLM Age [video] ( youtube.com ) \n 157 points by usernomdeguerre 6 hours ago | hide | 32 comments \n \n14. Show HN: Made an open-source Lego AI generator ( github.com/anteloc ) \n 54 points by antelocnova 3 hours ago | hide | 35 comments \n \n15. Every SaaS business will become a harness around a model ( sshh.io ) \n 68 points by iacguy 2 hours ago | hide | 51 comments \n \n16. Updates to Full Disk Access in macOS ( developer.apple.com ) \n 78 points by notfirstpost 4 hours ago | hide | 54 comments \n \n17. Open-sourcing AstaBrief, the fast report-generation model in Asta ( allenai.org ) \n 12 points by malshe 2 hours ago | hide | discuss \n \n18. Sites in ChatGPT ( chatgpt.com ) \n 186 points by polvi 8 hours ago | hide | 204 comments \n \n19. FLUX 3 Image ( bfl.ai ) \n 252 points by minimaxir 10 hours ago | hide | 57 comments \n \n20. Venice\u2019s failed war against Constantinople led to the first bond market ( bigthink.com ) \n 56 points by RickJWagner 5 hours ago | hide | 19 comments \n \n21. Blogging with Gleam, Org-Mode and Pandoc ( byzantine-systems.github.io ) \n 44 points by schonfinkel 5 hours ago | hide | 9 comments \n \n22. Anatomy of a Lean proof for software engineers ( agostbiro.net ) \n 68 points by abiro 5 hours ago | hide | 6 comments \n \n23. The Legend of von Neumann (1973) [pdf] ( gwern.net ) \n 232 points by suopspaces 10 hours ago | hide | 135 comments \n \n24. Show HN: Giving Opus 5.5 a simulated paint canvas ( stillwet.art ) \n 179 points by alstonite 10 hours ago | hide | 59 comments \n \n25. STS-51-F Abort-to-Orbit (1985) ( wikipedia.org ) \n 32 points by schoen 4 hours ago | hide | 9 comments \n \n26. The first packet sent via RFC1149 avian carrier is up for auction at Christie's ( christies.com ) \n 33 points by peter_hansteen 5 hours ago | hide | 3 comments \n \n27. F.02 Decommission ( figure.ai ) \n 51 points by ad_hockey 5 hours ago | hide | 18 comments \n \n28. Show HN: Pyxel \u2013 A Python retro game engine with built-in art and sound editors ( github.com/kitao ) \n 56 points by kitao 6 hours ago | hide | 6 comments \n \n29. What if we stopped using GPUs? [video] ( youtube.com ) \n 35 points by sandslash 5 hours ago | hide | 8 comments \n \n30. On social reality in China ( lesswrong.com ) \n 124 points by thicTurtlLverXX 6 hours ago | hide | 126 comments \n \n \n More \n \n \n \n \nConsider applying for YC's Winter 2027 batch! Applications are open till November 2. \nGuidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact \n \nSearch: \n", "preview_url": "https://changedetection.n8n-cloud.website/preview/6070e6a4-6bda-4687-acbb-a1994f9f29d8", "screenshot": null, "timestamp_from": null, "timestamp_to": null, "triggered_text": "", "llm_summary": null, "llm_intent": null, "uuid": "6070e6a4-6bda-4687-acbb-a1994f9f29d8", "watch_mime_type": "text/html; charset=utf-8", "watch_tag": "Tech news", "watch_title": "Hacker News", "watch_url": "https://news.ycombinator.com/", "watch_uuid": "6070e6a4-6bda-4687-acbb-a1994f9f29d8", "notification_urls": ["tgram://8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/500917782/?format=text"], "notification_title": "ChangeDetection.io Notification - {{watch_url}}", "notification_body": "{{watch_url}} had a change.\n---\n{{diff}}\n---\n", "notification_format": "htmlcolor", "_llm_result": null, "_llm_intent": "", "_llm_change_summary": "", "edit_url": "https://changedetection.n8n-cloud.website/edit/6070e6a4-6bda-4687-acbb-a1994f9f29d8"}}]
- Sat Oct 3 01:38:57 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Can\'t find end tag corresponding to start tag \\"s\\""}'
- 2026-10-03 01:38:57,921 - DEBUG - Response Details:
- 2026-10-03 01:38:57,921 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Can't find end tag corresponding to start tag "s", error=400.
- 2026-10-03 01:38:57,847 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://news.ycombinator.com/\r\nhttps://news.ycombinator.com/ had a change.\n---\n<s> 1. Apple Pass Designer ( developer.apple.com )</s>\n<s> 155 points by soheilpro 1 hour ago | hide | 95 comments</s>\n<s></s>\n<s> 2. Court agrees with EFF: Utah's VPN law demands a technical impossibility ( eff.org )</s>\n<s> 342 points by hn_acker 7 hours ago | hide | 145 comments</s>\n<s></s>\n<s> 3. Updates to Full Disk Access in macOS ( developer.apple.com )</s>\n<s> 49 points by notfirstpost 1 hour ago | hide | 28 comments</s>\n<s></s>\n<s> 4. A 12-year sequence of telescope images of a star and four planets orbiting ( bsky.app/theplanetaryguy.com )</s>\n<s> 71 points by mariuz 2 hours ago | hide | 14 comments</s>\n<s></s>\n<s> 5. Greg Kroah-Hartman – Security in the LLM Age [video] ( youtube.com )</s>\n<s> 94 points by usernomdeguerre 3 hours ago | hide | 15 comments</s>\n<s></s>\n<s> 6. With most information hidden, the game Stratego had stumped AI until now ( arstechnica.com )</s>\n<s> 88 points by PaulHoule 3 hours ago | hide | 25 comments</s>\n<s></s>\n<s> 7. &n', 'chat_id': 500917782}
- 2026-10-03 01:38:57,846 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-03 01:38:57,846 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream
- Fri Oct 2 22:38:57 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Can\'t find end tag corresponding to start tag \\"s\\""}'
- 2026-10-02 22:38:57,326 - DEBUG - Response Details:
- 2026-10-02 22:38:57,325 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Can't find end tag corresponding to start tag "s", error=400.
- 2026-10-02 22:38:57,256 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://news.ycombinator.com/\r\nhttps://news.ycombinator.com/ had a change.\n---\n<s> 1. Dutch Computer Museums ( aresluna.org )</s>\n<s> 24 points by npollock 44 minutes ago | hide | 6 comments</s>\n<s></s>\n<s> 2. The Legend of von Neumann (1973) [pdf] ( gwern.net )</s>\n<s> 163 points by suopspaces 4 hours ago | hide | 91 comments</s>\n<s></s>\n<s> 3. Court agrees with EFF: Utah's VPN law demands a technical impossibility ( eff.org )</s>\n<s> 86 points by hn_acker 4 hours ago | hide | 19 comments</s>\n<s></s>\n<s> 4. Tiny Brutalism ( placeholders.itch.io )</s>\n<s> 62 points by abetusk 2 hours ago | hide | 12 comments</s>\n<s></s>\n<s> 5. Sites in ChatGPT ( chatgpt.com )</s>\n<s> 26 points by polvi 2 hours ago | hide | 31 comments</s>\n<s></s>\n<s> 6. FLUX 3 Image ( bfl.ai )</s>\n<s> 88 points by minimaxir 4 hours ago | hide | 9 comments</s>\n<s></s>\n<s> 7. ', 'chat_id': 500917782}
- 2026-10-02 22:38:57,256 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-02 22:38:57,255 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream
- Fri Oct 2 19:38:56 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Can\'t find end tag corresponding to start tag \\"s\\""}'
- 2026-10-02 19:38:56,658 - DEBUG - Response Details:
- 2026-10-02 19:38:56,658 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Can't find end tag corresponding to start tag "s", error=400.
- 2026-10-02 19:38:56,586 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://news.ycombinator.com/\r\nhttps://news.ycombinator.com/ had a change.\n---\n<s> 1. The Legend of von Neumann [pdf] ( gwern.net )</s>\n<s> 37 points by suopspaces 1 hour ago | hide | 14 comments</s>\n<s></s>\n<s> 2. Pi 1.0 ( earendil.com )</s>\n<s> 1525 points by sergiotapia 19 hours ago | hide | 503 comments</s>\n<s></s>\n<s> 3. Shimano Bicycle Museum Review ( inrng.com )</s>\n<s> 214 points by pietroppeter 9 hours ago | hide | 38 comments</s>\n<s></s>\n<s> 4. Several vulnerabilities have been discovered in the Linux kernel ( lwn.net )</s>\n<s> 436 points by luispa 15 hours ago | hide | 304 comments</s>\n<s></s>\n<s> 5. Show HN: Audionaut – an open-source cross-platform multitrack audio editor ( github.com/kvoltmer )</s>\n<s> 73 points by vltmrkls 6 hours ago | hide | 28 comments</s>\n<s></s>\n<s> 6. Clef: Open-weight decision models, and new RL fine-tuning platform ( cloudflare.com )</s>\n<s> 563 points by jasondavies 22 hours ago | hide | 203 comments</s>\n<s></s>\n<s> 7. &nb', 'chat_id': 500917782}
- 2026-10-02 19:38:56,586 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-02 19:38:56,585 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream
- Fri Oct 2 16:38:55 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Can\'t find end tag corresponding to start tag \\"b\\""}'
- 2026-10-02 16:38:56,049 - DEBUG - Response Details:
- 2026-10-02 16:38:56,049 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Can't find end tag corresponding to start tag "b", error=400.
- 2026-10-02 16:38:55,967 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://news.ycombinator.com/\r\nhttps://news.ycombinator.com/ had a change.\n---\n<s> 1. Pi 1.0 ( earendil.com )</s>\n<s> 1363 points by sergiotapia 16 hours ago | hide | 431 comments</s>\n<s></s>\n<s> 2. Shimano Bicycle Museum Review ( inrng.com )</s>\n<s> 136 points by pietroppeter 6 hours ago | hide | 24 comments</s>\n<s></s>\n<s> 3. Several vulnerabilities have been discovered in the Linux kernel ( lwn.net )</s>\n<s> 344 points by luispa 12 hours ago | hide | 252 comments</s>\n<s></s>\n<s> 4. Why media fans want to escape algorithms with CDs, DVDs and vinyl ( theguardian.com )</s>\n<s> 28 points by beardyw 48 minutes ago | hide | 17 comments</s>\n<b> 1. The Legend of von Neumann [pdf] ( gwern.net )</b>\n<b> 37 points by suopspaces 1 hour ago | hide | 14 comments</b>\n<b></b>\n<b> 2. Pi 1.0 ( earendil.com )</b>\n<b> 1525 points by sergiotapia 19 hours ago | hide | 503 comments</b>\n<b></b>\n<b> 3. ', 'chat_id': 500917782}
- 2026-10-02 16:38:55,967 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-02 16:38:55,966 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream
- Fri Oct 2 13:38:55 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Can\'t find end tag corresponding to start tag \\"b\\""}'
- 2026-10-02 13:38:55,391 - DEBUG - Response Details:
- 2026-10-02 13:38:55,391 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Can't find end tag corresponding to start tag "b", error=400.
- 2026-10-02 13:38:55,322 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://news.ycombinator.com/\r\nhttps://news.ycombinator.com/ had a change.\n---\n <s>1225</s><b>1363</b> points by sergiotapia <s>13</s><b>16</b> hours ago | hide | <s>378</s><b>431</b> comments\n<s> 73 points by pietroppeter 3 hours ago | hide | 10 comments</s>\n<s></s>\n<s> 3. How Singapore's government-run dating service works ( singapore-samizdat.com )</s>\n<s> 132 points by danielfoster 6 hours ago | hide | 77 comments</s>\n<s></s>\n<s> 4. Several vulnerabilities have been discovered in the Linux kernel ( lwn.net )</s>\n<s> 267 points by luispa 9 hours ago | hide | 192 comments</s>\n<s></s>\n<s> 5. DeepSeek Harness Desktop for macOS and Windows ( deepseek.com )</s>\n<s> 210 points by Kuyawa 5 hours ago | hide | 104 comments</s>\n<b> 136 points by pietroppeter 6 hours ago | hide | 24 comments</b>\n<b></b>\n<b> 3. Several vulnerabilities have been discovered in the Linux kernel ( lwn.net )</b>\n<b> 344 points by luispa 12 hours ago | hide | 252 comments</b>\n<b></b>\n<b> 4. Why media fans want to escape algorithms with CDs, DVDs and vinyl ( theguardian.com )</b>\n<b> 28 points by beardyw 48 minutes ago | hide | 17 comments</b>\n<b></b>\n<b> 5. &nb', 'chat_id': 500917782}
- 2026-10-02 13:38:55,322 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-02 13:38:55,321 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream
- Fri Oct 2 10:38:55 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Can\'t find end tag corresponding to start tag \\"b\\""}'
- 2026-10-02 10:38:55,496 - DEBUG - Response Details:
- 2026-10-02 10:38:55,496 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Can't find end tag corresponding to start tag "b", error=400.
- 2026-10-02 10:38:55,425 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://news.ycombinator.com/\r\nhttps://news.ycombinator.com/ had a change.\n---\n<s> 990 points by sergiotapia 10 hours ago | hide | 317 comments</s>\n<s></s>\n<s> 2. DeepSeek Harness ( deepseek.com )</s>\n<s> 79 points by Kuyawa 2 hours ago | hide | 25 comments</s>\n<b> 1225 points by sergiotapia 13 hours ago | hide | 378 comments</b>\n<b></b>\n<b> 2. Shimano Bicycle Museum Review ( inrng.com )</b>\n<b> 73 points by pietroppeter 3 hours ago | hide | 10 comments</b>\n<s> 63 points by danielfoster 3 hours ago | hide | 29 comments</s>\n<s></s>\n<s> 4. Meta's Muse is fantastic for web scraping ( sigh.dev )</s>\n<s> 12 points by STRiDEX 41 minutes ago | hide | 6 comments</s>\n<s></s>\n<s> 5. Shimano Bicycle Museum Review ( inrng.com )</s>\n<s> 5 points by pietroppeter 24 minutes ago | hide | discuss</s>\n<b> 132 points by danielfoster 6 hours ago | hide | 77 comments</b>\n<b></b>\n<b> 4. Several vulnerabilities have been discovered in the Linux kernel ( lwn.net )</b>\n<b> 267 points by luispa 9 hours ago | hide | 192 comments</b>\n<b></b>\n<b> 5. DeepSee', 'chat_id': 500917782}
- 2026-10-02 10:38:55,425 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-02 10:38:55,424 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream
- Fri Oct 2 07:38:54 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Can\'t find end tag corresponding to start tag \\"s\\""}'
- 2026-10-02 07:38:54,574 - DEBUG - Response Details:
- 2026-10-02 07:38:54,574 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Can't find end tag corresponding to start tag "s", error=400.
- 2026-10-02 07:38:54,493 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://news.ycombinator.com/\r\nhttps://news.ycombinator.com/ had a change.\n---\n<s> 1. Pi 1.0 ( earendil.com )</s>\n<s> 798 points by sergiotapia 7 hours ago | hide | 278 comments</s>\n<s></s>\n<s> 2. Several vulnerabilities have been discovered in the Linux kernel ( lwn.net )</s>\n<s> 118 points by luispa 3 hours ago | hide | 69 comments</s>\n<s></s>\n<s> 3. Clef: Open-weight decision models, and new RL fine-tuning platform ( cloudflare.com )</s>\n<s> 442 points by jasondavies 10 hours ago | hide | 163 comments</s>\n<s></s>\n<s> 4. SvelteKit 3 ( svelte.dev )</s>\n<s> 132 points by sampsn 6 hours ago | hide | 52 comments</s>\n<s></s>\n<s> 5. Ask HN: Who is hiring? (October 2026)</s>\n<s> 161 points by whoishiring 11 hours ago | hide | 162 comments</s>\n<s></s>\n<s> 6. Pi Durable ( earendil.com )</s>\n<s> 239 points by paulsmith 7 hours ago | hide | 26 comments</s>\n<s></s>\n<s> 7. ', 'chat_id': 500917782}
- 2026-10-02 07:38:54,493 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-02 07:38:54,492 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream
- Fri Oct 2 04:38:53 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Can\'t find end tag corresponding to start tag \\"s\\""}'
- 2026-10-02 04:38:53,871 - DEBUG - Response Details:
- 2026-10-02 04:38:53,871 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Can't find end tag corresponding to start tag "s", error=400.
- 2026-10-02 04:38:53,802 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://news.ycombinator.com/\r\nhttps://news.ycombinator.com/ had a change.\n---\n<s> 1. Pi 1.0 ( earendil.com )</s>\n<s> 617 points by sergiotapia 4 hours ago | hide | 204 comments</s>\n<s></s>\n<s> 2. Clef: Open-weight decision models, and new RL fine-tuning platform ( cloudflare.com )</s>\n<s> 393 points by jasondavies 7 hours ago | hide | 153 comments</s>\n<s></s>\n<s> 3. SvelteKit 3 ( svelte.dev )</s>\n<s> 78 points by sampsn 3 hours ago | hide | 21 comments</s>\n<s></s>\n<s> 4. Show HN: Janus – Go binary that runs GGUF models via Vulkan on AMD/Intel/Nvidia ( github.com/vibra-ingenn )</s>\n<s> 41 points by Maverick617 3 hours ago | hide | 4 comments</s>\n<s></s>\n<s> 5. Ask HN: Who is hiring? (October 2026)</s>\n<s> 136 points by whoishiring 8 hours ago | hide | 138 comments</s>\n<s></s>\n<s> 6. CSS Bed: Classless CSS themes to use as starting points in web development ( cssbed.com )</s>\n<s> 32 points by sea-gold 2 hours ago | hide | 7 comments</s>\n<s></s>\n<s> 7. ', 'chat_id': 500917782}
- 2026-10-02 04:38:53,801 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-02 04:38:53,801 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream
- Fri Oct 2 01:38:53 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Can\'t find end tag corresponding to start tag \\"s\\""}'
- 2026-10-02 01:38:53,143 - DEBUG - Response Details:
- 2026-10-02 01:38:53,143 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Can't find end tag corresponding to start tag "s", error=400.
- 2026-10-02 01:38:53,076 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://news.ycombinator.com/\r\nhttps://news.ycombinator.com/ had a change.\n---\n<s> 223 points by sergiotapia 1 hour ago | hide | 86 comments</s>\n<s></s>\n<s> 2. Clef: Open-source decision models, and new RL fine-tuning platform ( cloudflare.com )</s>\n<s> 319 points by jasondavies 4 hours ago | hide | 131 comments</s>\n<s></s>\n<s> 3. RIP, vector database ( turbopuffer.com )</s>\n<s> 219 points by razin 4 hours ago | hide | 60 comments</s>\n<s></s>\n<s> 4. Oxygen-deprived underwater zones may not be "dead zones" but clue to early life ( wiley.com )</s>\n<s> 36 points by gumby 1 hour ago | hide | 1 comment</s>\n<s></s>\n<s> 5. StreetComplete on iOS is now in public beta ( github.com/streetcomplete )</s>\n<s> 468 points by Snowly 9 hours ago | hide | 107 comments</s>\n<s></s>\n<s> 6. Bez: Generating a browser engine from specs and tests ( tangled.org/burrito.space )</s>\n<s> 54 points by nerdypepper 2 hours ago | hide | 16 comments</s>\n<s></s>\n<s> 7. Ask HN: Who is hiring? (October 2026)</s>\n<s> 111 points by whoishi', 'chat_id': 500917782}
- 2026-10-02 01:38:53,075 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-02 01:38:53,075 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream
- Thu Oct 1 22:38:52 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Can\'t find end tag corresponding to start tag \\"s\\""}'
- 2026-10-01 22:38:52,398 - DEBUG - Response Details:
- 2026-10-01 22:38:52,398 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Can't find end tag corresponding to start tag "s", error=400.
- 2026-10-01 22:38:52,310 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://news.ycombinator.com/\r\nhttps://news.ycombinator.com/ had a change.\n---\n<s> 1. Clef: our open-source decision models ( cloudflare.com )</s>\n<s> 133 points by jasondavies 1 hour ago | hide | 46 comments</s>\n<s></s>\n<s> 2. Git 3.0's upcoming SHA-256 default will be a costly mistake ( gitbutler.com )</s>\n<s> 47 points by chmaynard 40 minutes ago | hide | 30 comments</s>\n<s></s>\n<s> 3. RIP, vector database ( turbopuffer.com )</s>\n<s> 85 points by razin 1 hour ago | hide | 19 comments</s>\n<s></s>\n<s> 4. StreetComplete on iOS is now in public beta ( github.com/streetcomplete )</s>\n<s> 398 points by Snowly 6 hours ago | hide | 86 comments</s>\n<s></s>\n<s> 5. RacketCon Is Saturday ( racket-lang.org )</s>\n<s> 63 points by spdegabrielle 2 hours ago | hide | 18 comments</s>\n<s></s>\n<s> 6. How to speed up the Rust compiler in September 2026 ( nnethercote.github.io )</s>\n<s> 172 points by trickypr 4 hours ago | hide | 83 comments</s>\n<s></s>\n<s> 7. ', 'chat_id': 500917782}
- 2026-10-01 22:38:52,310 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-01 22:38:52,309 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream
- Thu Oct 1 19:38:52 2026 - SENDING - null
- b'{"ok":false,"error_code":400,"description":"Bad Request: can\'t parse entities: Can\'t find end tag corresponding to start tag \\"s\\""}'
- 2026-10-01 19:38:52,634 - DEBUG - Response Details:
- 2026-10-01 19:38:52,634 - WARNING - Failed to send Telegram notification to 500917782: Bad Request: can't parse entities: Can't find end tag corresponding to start tag "s", error=400.
- 2026-10-01 19:38:52,561 - DEBUG - Telegram Payload: {'disable_notification': False, 'disable_web_page_preview': True, 'parse_mode': 'HTML', 'text': 'ChangeDetection.io Notification - https://news.ycombinator.com/\r\nhttps://news.ycombinator.com/ had a change.\n---\n<s> 1. StreetComplete on iOS is now in public beta ( github.com/streetcomplete )</s>\n<s> 242 points by Snowly 3 hours ago | hide | 57 comments</s>\n<s></s>\n<s> 2. How to speed up the Rust compiler in September 2026 ( nnethercote.github.io )</s>\n<s> 66 points by trickypr 1 hour ago | hide | 22 comments</s>\n<s></s>\n<s> 3. GPT-Synopsys: Frontier Intelligence to Revolutionize Chip Design ( synopsys.com )</s>\n<s> 98 points by giuliomagnifico 4 hours ago | hide | 46 comments</s>\n<s></s>\n<s> 4. Google breaks promise to provide 10 years of updates to Chromebooks ( osnews.com )</s>\n<s> 163 points by speckx 1 hour ago | hide | 73 comments</s>\n<s></s>\n<s> 5. OpenDLSS: A Vulkan Reimplementation of Nvidia's DLSS 5 Neural Rendering Network ( github.com/maanhimself )</s>\n<s> 175 points by sagacity 7 hours ago | hide | 88 comments</s>\n<s></s>\n<s> 6. Meta Uses A.I. Data Centers to Avoid Billions in Federal Taxes ( nytimes.com )</s>\n<s> 82 points by gmays 1 hour ago | hide |', 'chat_id': 500917782}
- 2026-10-01 19:38:52,561 - DEBUG - Telegram POST URL: https://api.telegram.org/bot8617625137:AAFmZ9nkDv3xVqMiEQrCIrD3MfV7Y4dBXkU/sendMessage (cert_verify=True)
- 2026-10-01 19:38:52,560 - DEBUG - Loaded Telegram URL: tgram://8...U/500917782/?image=False&detect=no&silent=no&preview=no&content=before&mdv=v1&format=text&overflow=upstream