What's Changed
- Update orjson requirement from ~=3.12 to ~=3.13 by @dependabot[bot] in #4542
- LLM restock: fix locale-formatted string prices (1.299,95 read as 1.29995) by @dgtlmoon in #4544
- Puppeteer fetcher - PDF improvements, Handle PDF fetching by Puppeteer directly, cleanup supports by @dgtlmoon in #4547
- Test - Puppeteer/Playwright PDF - Checksum the original document not the browser's PDF viewer HTML, browser PDF test by @dgtlmoon in #4548
- PDF - Keep the original PDF of the newest two versions by @dgtlmoon in #4549
- update spanish translations by @abrugues in #4546
- Update pydantic requirement from <3.0,>=2.13.5 to >=2.14.0,<3.0 by @dependabot[bot] in #4543
- Proxy auth fixes and extra tests for Puppeteer content fetcher by @dgtlmoon in #4552
- Update validators requirement from ~=0.35 to ~=0.36 by @dependabot[bot] in #4558
- Update pre-commit requirement from >=4.6.2 to >=4.7.0 by @dependabot[bot] in #4557
- UI - Fixing notification settings still trying to access main settings form that caused a crash on save by @dgtlmoon in #4561
- Update flask-socketio requirement from <6,>=5.6.1 to >=5.7.0,<6 by @dependabot[bot] in #4540
- UI - Follow the device's light/dark setting by default by @cookieguru in #4507
- Watch history index - Replace per-snapshot realpath()/exists() with a single directory listing, speeds up loading times by @dgtlmoon in #4562
- docker-compose - SCREENSHOT_MAX_HEIGHT default is 20000, not 16000 by @pcbeingused333 in #4568
- Restock: let a plugin do LLM price/stock extraction without litellm (HTML + text hook, reusable helpers) by @dgtlmoon in #4545
- Update chardet requirement from >=7.6.0 to >=7.7.0 by @dependabot[bot] in #4582
- Bump pypa/gh-action-pypi-publish from 1.14.2 to 1.14.3 in the all group by @dependabot[bot] in #4583
- Update pluggy requirement from ~=1.6 to ~=1.7 by @dependabot[bot] in #4581
- Update selenium requirement from ~=4.50.0 to ~=4.51.0 by @dependabot[bot] in #4580
- Notifications - Fix |regex_replace doing nothing when rendered outside the main thread by @Enesuygurs in #4577
- feat(api): expand SystemInfo endpoint with queue metrics, config flags, and tag_count by @Subere in #4574
- Log puremagic "Could not identify file" at debug instead of warning by @jtannahill in #4533
- Fix IndexError on empty/whitespace-only JSON content by @Yi-111-a in #4534
- Decode percent-encoded proxy credentials for the browser fetchers, and keep them out of the log by @alkaz-nodemaven in #4502
- Judge favicon expiry on the icon the watch actually has, not whatever glob lists first by @dgtlmoon in #4434
- Bump cryptography from 44.0.0 to 50.0.0 by @dependabot[bot] in #4284
- Notifications - |regex_replace ReDoS timeout now works in any thread (use 'regex' package timeout=) by @dgtlmoon in #4585
- Fix Jinja2 false-positive when URL contains
{%by @skkzsh in #4208 - Favicon - Clear the saved favicon when the watch URL changes by @dgtlmoon in #4586
- Tests - Fix test_itemprop_percent_threshold for WTForms 3.3 (FloatField is now type="number") by @dgtlmoon in #4588
- API - Reject broken Jinja2 templates in url, link_to_open, body and headers (shared with the edit form) by @dgtlmoon in #4587
- Improvements to plugin architecture by @dgtlmoon in #4589
- Update litellm requirement from >=1.40.0 to >=1.106.2 by @dependabot[bot] in #4595
- LLM Config - Dont import LiteLLM until a real config is used (saves memory) by @dgtlmoon in #4596
- Update ruff requirement from >=0.16.10 to >=0.17.1 by @dependabot[bot] in #4594
- Update inscriptis requirement from <2.7.6,>=2.7 to >=2.7.5,<2.7.6 by @dependabot[bot] in #4593
- Update regex requirement from >=2022.1.18 to >=2026.9.29 by @dependabot[bot] in #4592
- Update pytest-mock requirement from ~=3.16 to ~=3.17 by @dependabot[bot] in #4599
- Update jsonpath-ng requirement from ~=1.9.1 to ~=1.12.0 by @dependabot[bot] in #4598
- Update pydantic requirement from <3.0,>=2.14.0 to >=2.14.1,<3.0 by @dependabot[bot] in #4591
- Build - Switch to uv for build by @dgtlmoon in #4600
- Restock: don't blame stock data when restock detection is off by @drakeo338 in #4495
- fix(strip_ignore_text): keep the surviving lines in document order by @Yi-111-a in #4536
- fix(filters): separate each match on its own line for source: watches by @Yi-111-a in #4492
- UI - Watchlist - "Mark unviewed" bulk operation by @pongoe in #4484
- API - Recheck only watches with errors, never recheck paused watches (#4506) by @dgtlmoon in #4601
New Contributors
- @abrugues made their first contribution in #4546
- @cookieguru made their first contribution in #4507
- @pcbeingused333 made their first contribution in #4568
- @Enesuygurs made their first contribution in #4577
- @Subere made their first contribution in #4574
- @jtannahill made their first contribution in #4533
- @Yi-111-a made their first contribution in #4534
- @alkaz-nodemaven made their first contribution in #4502
- @drakeo338 made their first contribution in #4495
Full Changelog: 0.60.9...0.60.10