--- snapshot-1791458456+++ snapshot-1793644360@@ -4,7 +4,127 @@ \__|_||_\__,_|_||_\__, \___\__,_\___|\__\___\__|\__|_\___/_||_(_)_\___/ |___/ -HEAD / 2026-10-08 10:30:05 +0200: +HEAD / 2026-11-02 15:03:53 +0100: + - MCP - history tools: list_snapshots, find_change (Watch.find_change) and get_history (snapshots as diffs) (#4649) + - Docs - Use explicit container registry (#4648) + - MCP server at /mcp, plus GET /api/v1/changes, so AI assistants can use changedetection.io (#4636) + - AI - Remove the unused llm_prefilter (AI CSS pre-filter) and its setup call (#4646) + - LLM restock: never strip / as site chrome (a class like Amazon's "mn-nav-stripe-moved" wiped the whole page) (#4644) + - LLM restock - keep the whole page when site-chrome removal would take nearly all of it, log when nothing is left (#4647) + - AI settings - Load models / Test connection work for a keyless server (Ollama) at an address not saved yet (#4645) + - LLM - "Switch thinking off" option for Ollama and OpenAI-compatible servers (llama.cpp, vLLM, LM Studio) (#4638) (#4643) + - Bumping licences + - Restock - Prices in the visitor's language with the currency's own decimal places (ISO 4217), the same on every page (#4615) (#4640) + - Datastore - startup checks run for every datastore again (removepassword.lock, missing RSS/API tokens, app_guid, version_tag) (#4639) + - Settings - AI / LLM settings get their own page at /settings/llm, linked from the left sidebar (#4637) + - API - systeminfo overdue_watches no longer lists paused watches (#4607) (#4635) + - Plugins - register_blueprints hook so plugins can mount their own Flask blueprints (#4632) + - Notifications - setup widget, pick a service and fill in a few fields instead of writing Apprise URLs by hand (#4634) + - Update jsonpath-ng requirement from ~=1.13.0 to ~=1.14.0 (#4628) + - Notifications - post:// get:// etc, a header with capitals (?+X-Key=...) was also sent as a query parameter (#4633) + - Bump apprise from 2.0.1 to 2.1.0 (#4627) + - Test fix - Related to filter failure counter #4620 #4624 #3507 + - Bump docker/login-action from 4.6.0 to 4.7.0 in the all group (#4629) + - API Examples (#4625) + - Bug: Successful checks always reset the filter failure streak, "no text found" records last_check_status (#4620) (#4624) + - Bug: A watch that was fine (200) and then starts getting 403 must not keep reporting the old 200 (#4606) + - Example plugins - API fetcher and check stats, watch list notes hook, update_finalize fix (#4622) + - Example plugins - Each example is a standalone `pip install .` package, README per example + - API - Extend 'processor' API - Current restock price/stock state in watch GET and list (processor_state_{processor_name}) (#4621) + - Watch memory - share one read-only copy of identical time_schedule_limit values (#4602) + - Update README.md + - Bumping NOTICE and ensuring compatibility (#4618) + - Bump the Contributors to a grid of links from contrib.rocks + - Elementpath - Remove custom code and reuse existing function + - README - Updating banner + - Important HTML->text library update (inscriptis) fixes memory use expansion caused by tables, remove phantom whitespaces from selected elements, may cause whitespace changes. + - Scheduler - It may have been possible to import/restore/API update watches without 'use default schedule' set and a null recheck schedule causing excessive page fetching. (#4617) + - README - Link to LLM key setup tutorial + - README - Updating screenshot + - Backups - Ability to select multiple .ZIPs of the watch data to restore (#4616) + - UI - Name the diff minimap so it reads as where, not when (#4613) + - Read the element locking scripts as UTF-8 (#4614) + - i18n: Extract restock strings and add ja translations (#4608) + - Update wtforms requirement from ~=3.2 to ~=3.3 (#4610) + - Update jsonpath-ng requirement from ~=1.12.0 to ~=1.13.0 (#4603) + - Update ruff requirement from >=0.17.1 to >=0.17.2 (#4604) + + - 0.60.10 + - API - Recheck only watches with errors, never recheck paused watches (#4506) (#4601) + - UI - Watchlist - "Mark unviewed" bulk operation (#4484) + - fix(filters): separate each match on its own line for source: watches (#4492) + - Keep the surviving lines of strip_ignore_text() in document order (#4536) + - Restock: don't blame stock data when restock detection is off (#4495) + - Testing - Include durations output + - Build - Switch to UI for build (#4600) + - Update pydantic requirement from <3.0,>=2.14.0 to >=2.14.1,<3.0 (#4591) + - Update Brotli library specifics + - More litellm build fixes + - LiteLLM - Pin to older version for armv7 because it cant build newer versions + - Update jsonpath-ng requirement from ~=1.9.1 to ~=1.12.0 (#4598) + - Update pytest-mock requirement from ~=3.16 to ~=3.17 (#4599) + - UI - Settings tab - Fix error handling on field errors + - Update regex requirement from >=2022.1.18 to >=2026.9.29 (#4592) + - Update inscriptis requirement from <2.7.6,>=2.7 to >=2.7.5,<2.7.6 (#4593) + - Update ruff requirement from >=0.16.10 to >=0.17.1 (#4594) + - LLM Config - Dont import LiteLLM until a real config is used (saves memory) (#4596) + - Update litellm requirement from >=1.40.0 to >=1.106.2 (#4595) + - Improvements to plugin architecture (#4589) + - API - Reject broken Jinja2 templates in url, link_to_open, body and headers (shared with the edit form) (#4587) + - Tests - Fix test_itemprop_percent_threshold for WTForms 3.3 (FloatField is now type="number") (#4588) + - Favicon - Clear the saved favicon when the watch URL changes (#4569) (#4586) + - Fix Jinja2 false-positive when URL contains `{%` (#4208) + - Notifications - |regex_replace ReDoS timeout now works in any thread (use 'regex' package timeout=) (#4585) + - Bump cryptography from 44.0.0 to 50.0.0 (#4284) + - Judge favicon expiry on the icon the watch actually has, not whatever glob lists first (#4434) + - Decode proxy credentials for browser fetchers and redact them in logs (#4502) + - Fix IndexError on empty/whitespace-only JSON content (#4534) + - Log puremagic "Could not identify file" at debug instead of warning (#4533) + - API - Rebuild HTML docs + - feat(api): expand SystemInfo - Code tidyup + - feat(api): expand SystemInfo endpoint with queue metrics, config flags, and tag_count (#4574) + - Notifications - Fix |regex_replace doing nothing when rendered outside the main thread (#4577) + - Update selenium requirement from ~=4.50.0 to ~=4.51.0 (#4580) + - Update pluggy requirement from ~=1.6 to ~=1.7 (#4581) + - Bump pypa/gh-action-pypi-publish from 1.14.2 to 1.14.3 in the all group (#4583) + - Update chardet requirement from >=7.6.0 to >=7.7.0 (#4582) + - Restock: let a plugin do LLM price/stock extraction without litellm (HTML + text hook, reusable helpers) (#4545) + - docker-compose.yml - SCREENSHOT_MAX_HEIGHT default is 20000, not 16000 (#4568) + - Watch history index - Replace per-snapshot realpath()/exists() with a single directory listing (#4562) + - UI - Follow the device's light/dark setting by default (#4507) + - Update flask-socketio requirement from <6,>=5.6.1 to >=5.7.0,<6 (#4540) + - UI - Fixing notification settings still trying to access main settings form that caused a crash on save (#4561) + - Update pre-commit requirement from >=4.6.2 to >=4.7.0 (#4557) + - Update validators requirement from ~=0.35 to ~=0.36 (#4558) + - Proxy auth fixes and extra tests for Puppeteer content fetcher (#4552) + - Update pydantic requirement from <3.0,>=2.13.5 to >=2.14.0,<3.0 (#4543) + - I18n Update spanish translations (#4546) + - PDF - Keep the original PDF of the newest two versions (#4549) + - Test - Puppeteer/Playwright PDF - Checksum the original document not the browser's PDF viewer HTML, browser PDF test (#4548) + - Puppeteer fetcher - PDF improvements, Handle PDF fetching by Puppeteer directly, cleanup supports (#4547) + - LLM restock: fix locale-formatted string prices (1.299,95 read as 1.29995) (#4544) + - Update orjson requirement from ~=3.12 to ~=3.13 (#4542) + + - 0.60.9 + - Update pytest-mock requirement from ~=3.15 to ~=3.16 (#4532) + - ci: keep release metadata out of inline shell and lock down the container publish path (#4510) + - Update pydantic requirement from <3.0,>=2.0 to >=2.13.5,<3.0 (#4528) + - Bump elementpath from 5.1.1 to 5.1.4 (#4526) + - Update jsonpath-ng requirement from ~=1.8.0 to ~=1.9.1 (#4527) + - Update orjson requirement from ~=3.11 to ~=3.12 (#4524) + - Update beautifulsoup4 requirement (#4523) + - Update pyppeteerstealth requirement from >=0.0.4 to >=0.0.5 (#4522) + - Update ruff requirement from >=0.11.2 to >=0.16.10 (#4521) + - Update selenium requirement from ~=4.49.0 to ~=4.50.0 (#4520) + - Bump apprise from 1.13.1 to 2.0.1 (#4518) + - Update greenlet requirement from >=3.0.3 to >=3.5.6 (#4519) + - Update jsonschema requirement from <5.0.0,>=4.24.0 to >=4.26.0,<5.0.0 (#4517) + - Update python-engineio requirement from <5,>=4.13.1 to >=4.14.0,<5 (#4516) + - Bump cryptography from 44.0.0 to 50.0.2 (#4513) + - Update lxml requirement (#4505) + - Update requirements.txt, update inscriptis 2.2 - 2.7 + - Bump werkzeug from 3.1.6 to 3.1.9 (#4514) + - Update pre-commit requirement from >=4.2.0 to >=4.6.2 (#4512) - UI - Language selector should be available on the login page (#4490) (#4501) - feat(jinja2): add unixtime filter to format Unix timestamps in notifications (#3641) (#4503) - Update pytest requirement from ~=9.0 to ~=9.1 (#4504)