AI Slop Code RIsk Monitor

dgtlmoon/changedetection.io

Best and simplest tool for website change detection, web page monitoring, and website change alerts. Perfect for tracking content changes, price drops, restock alerts, and website defacement monitoring—all for free or enjoy our SaaS plan!

37.3 High pattern signal View on GitHub

Maintenance and Governance Review

This report summarizes scanner evidence for dgtlmoon/changedetection.io, a Python project with 34,880 GitHub stars. SynthScan examined 111,983 lines of code across 518 source files, recording 2709 pattern matches distributed across 22 syntactic categories. The legacy adjusted pattern signal is 37.3 (High pattern signal); it is not an authorship estimate.

Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.

37.3
Adjusted Signal
37.3
Raw Pattern Score
100%
Time Factor
2026-10-09
Last Push
34.9K
Stars
Python
Language
112.0K
Lines of Code
518
Files
2.7K
Pattern Hits
2026-10-12
Scan Date
0.39
HC Hit Rate

Risk Review · v3

Use each vector to guide manual verification of the underlying findings.

Cognitive Ownership Risk 54.5/100 · HIGH

Can maintainers explain intent, assumptions, and trade-offs? 1605 finding(s).

Hallucinated Dependency & Supply Chain Risk 30.5/100 · MEDIUM

Are imports declared and package/API names verified? 453 finding(s).

Agent Over-Engineering Ratio 70.9/100 · HIGH

Are wrappers, guards, and repeated structures necessary? 1850 finding(s).

PR Review Velocity Impact 85.5/100 · CRITICAL

Which changes need focused human review? 2709 finding(s).

What These Metrics Mean

Adjusted Signal
Legacy pattern score normalized per 1,000 scanned lines and multiplied by the repository-level time factor. It is not an estimate of AI authorship.
Raw Pattern Score
Sum of severity- and context-weighted pattern findings before applying the time factor.
Time Factor
A coarse multiplier based on repository last-push metadata. It does not identify when individual code was written.
Pattern Hits
Count of configured pattern findings. Review each location and surrounding code before acting.
HC Hit Rate
High- and critical-severity findings per scanned file. Severity is a configured detector weight, not proof of a vulnerability or authorship.
Lines / Files
Scan coverage denominators used by the legacy normalized score.

Pattern-Signal History

This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.

Severity Breakdown

Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.

CRITICAL 3HIGH 199MEDIUM 299LOW 2208

Directory Score Breakdown

This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.

Pattern Findings

The scanner identified 2709 distinct pattern matches across 22 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.

Hyper-Verbose Identifiers1177 hits · 1146 pts
SeverityFileLineSnippetContext
LOW⚡changedetectionio/pluggy_interface.py280def inject_datastore_into_plugins(datastore):CODE
LOW⚡changedetectionio/pluggy_interface.py296def register_builtin_fetchers():CODE
LOWchangedetectionio/pluggy_interface.py64 def get_itemprop_availability_override(self, content, fetcher_name, fetcher_instance, url, llm_intent=None):CODE
LOWchangedetectionio/pluggy_interface.py244def load_plugins_from_directories():CODE
LOWchangedetectionio/pluggy_interface.py318def register_builtin_restock_plugins():CODE
LOWchangedetectionio/pluggy_interface.py336def collect_ui_edit_stats_extras(watch):CODE
LOWchangedetectionio/pluggy_interface.py351def collect_fetcher_status_icons(fetcher_name):CODE
LOWchangedetectionio/pluggy_interface.py371def get_itemprop_availability_from_plugin(content, fetcher_name, fetcher_instance, url, llm_intent=None):CODE
LOWchangedetectionio/pluggy_interface.py563def get_plugin_template_paths():CODE
LOWchangedetectionio/pluggy_interface.py619def apply_update_handler_alter(update_handler, watch, datastore):CODE
LOW⚡changedetectionio/worker.py790async def send_content_changed_notification(watch_uuid, notification_q, datastore):CODE
LOW⚡changedetectionio/worker.py803async def send_filter_failure_notification(watch_uuid, notification_q, datastore):CODE
LOW⚡changedetectionio/worker.py816async def send_step_failure_notification(watch_uuid, step_n, notification_q, datastore):CODE
LOWchangedetectionio/worker.py32def set_watch_minitext_status(watch, status):CODE
LOWchangedetectionio/rss_tools.py9def cdata_in_document_to_text(html_content: str, render_anchor_tag_content=False) -> str:CODE
LOW⚡changedetectionio/worker_pool.py134async def start_single_async_worker(worker_id, update_q, notification_q, app, datastore, executor=None):CODE
LOW⚡changedetectionio/worker_pool.py351def is_watch_running_by_another_worker(watch_uuid, current_worker_id):CODE
LOWchangedetectionio/worker_pool.py285def claim_uuid_for_processing(uuid, worker_id):CODE
LOWchangedetectionio/worker_pool.py312def release_uuid_from_processing(uuid, worker_id):CODE
LOWchangedetectionio/worker_pool.py447def adjust_async_worker_count(new_count, update_q=None, notification_q=None, app=None, datastore=None):CODE
LOW⚡changedetectionio/queue_handlers.py551 def _emit_notification_signal(self, item: Dict[str, Any]):CODE
LOWchangedetectionio/notification_service.py57def watch_will_send_content_changed_notification(datastore, watch):CODE
LOWchangedetectionio/notification_service.py261 def set_random_for_validation(self):CODE
LOWchangedetectionio/notification_service.py279def add_rendered_diff_to_notification_vars(notification_scan_text:str, prev_snapshot:str, current_snapshot:str, word_difCODE
LOWchangedetectionio/notification_service.py344def set_basic_notification_vars(current_snapshot, prev_snapshot, watch, triggered_text, timestamp_changed=None):CODE
LOWchangedetectionio/notification_service.py376 def queue_notification_for_watch(self, n_object: NotificationContextData, watch, date_index_from=-2, date_index_to=-CODE
LOWchangedetectionio/notification_service.py433 def send_content_changed_notification(self, watch_uuid):CODE
LOWchangedetectionio/notification_service.py477 def send_filter_failure_notification(self, watch_uuid):CODE
LOWchangedetectionio/notification_service.py525 def send_step_failure_notification(self, watch_uuid, step_n):STRING
LOWchangedetectionio/notification_service.py574def create_notification_service(datastore, notification_q):STRING
LOW⚡changedetectionio/validate_url.py203def is_url_private_or_parser_confused(url):CODE
LOWchangedetectionio/__init__.py81def configure_litellm_pricing_source():CODE
LOWchangedetectionio/__init__.py534 def queue_watches_for_recheck(datastore, iteration):CODE
LOWchangedetectionio/forms.py883# def validate_notification_urls(self, field):COMMENT
LOWchangedetectionio/forms.py260def validate_time_between_check_has_values(form):CODE
LOWchangedetectionio/html_tools.py227def perl_style_slash_enclosed_regex_to_options(regex):CODE
LOWchangedetectionio/html_tools.py277def subtractive_xpath_selector(selectors: List[str], html_content: str) -> str:CODE
LOWchangedetectionio/html_tools.py535def _sanitize_lone_surrogate_str(value: str) -> str:CODE
LOWchangedetectionio/html_tools.py538def _sanitize_lone_surrogates(value):CODE
LOWchangedetectionio/html_tools.py592def _get_stripped_text_from_json_match(match):CODE
LOWchangedetectionio/html_tools.py613def extract_json_blob_from_html(content, ensure_is_ldjson_info_type, json_filter):CODE
LOWchangedetectionio/html_tools.py790def cdata_in_document_to_text(html_content: str, render_anchor_tag_content=False) -> str:CODE
LOWchangedetectionio/html_tools.py882def workarounds_for_obfuscations(content):CODE
LOWchangedetectionio/auth_decorator.py16def login_optionally_required(func):CODE
LOWchangedetectionio/languages.py74def _build_short_timeago_rows():CODE
LOWchangedetectionio/languages.py98def register_short_timeago_locale(flask_locale):CODE
LOWchangedetectionio/flask_app.py195def _configure_plugin_templates():CODE
LOWchangedetectionio/flask_app.py505def _get_watch_queue_position(watch_obj):CODE
LOWchangedetectionio/flask_app.py512def _get_current_worker_count():CODE
LOWchangedetectionio/flask_app.py837 def inject_llm_features_disabled():CODE
LOWchangedetectionio/flask_app.py843 def inject_has_visual_browser():CODE
LOWchangedetectionio/flask_app.py916 def strip_duplicate_date_header(response):CODE
LOWchangedetectionio/flask_app.py1094 def before_request_handle_cookie_x_settings():CODE
LOWchangedetectionio/flask_app.py1666def ticker_thread_check_time_launch_checks():CODE
LOWchangedetectionio/llm/prompt_builder.py122def build_preview_system_prompt() -> str:CODE
LOWchangedetectionio/llm/prompt_builder.py139def build_change_summary_prompt(CODE
LOWchangedetectionio/llm/prompt_builder.py164def build_change_summary_system_prompt() -> str:CODE
LOWchangedetectionio/llm/prompt_builder.py206def build_setup_system_prompt() -> str:CODE
LOW⚡changedetectionio/llm/evaluator.py438def get_global_token_budget_month(datastore=None) -> int:CODE
LOWchangedetectionio/llm/evaluator.py174def apply_local_token_multiplier(base_max_tokens: int, llm_cfg: dict) -> int:CODE
1117 more matches not shown…
Decorative Section Separators211 hits · 809 pts
SeverityFileLineSnippetContext
MEDIUMchangedetectionio/__init__.py24# ==============================================================================COMMENT
MEDIUMchangedetectionio/__init__.py26# ==============================================================================COMMENT
MEDIUMchangedetectionio/__init__.py61# ==============================================================================COMMENT
MEDIUMchangedetectionio/html_tools.py11# ---------------------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/html_tools.py91# ---------------------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/test_cli_opts.sh55# =============================================================================COMMENT
MEDIUMchangedetectionio/test_cli_opts.sh57# =============================================================================COMMENT
MEDIUMchangedetectionio/test_cli_opts.sh198# =============================================================================COMMENT
MEDIUMchangedetectionio/test_cli_opts.sh200# =============================================================================COMMENT
MEDIUM⚡changedetectionio/llm/evaluator.py429# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/llm/evaluator.py431# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/llm/evaluator.py629# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/llm/evaluator.py631# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/llm/evaluator.py828# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/llm/evaluator.py830# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/llm/evaluator.py885# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/llm/evaluator.py887# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py267# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py269# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py370# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py372# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py538# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py540# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py727 # ------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py730 # ------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py739 # ------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py742 # ------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py752 # ------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py756 # ------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py773 # ------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py776 # ------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py863 # ---------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py865 # ---------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py872 # ---------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py874 # ---------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py886 # ---------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py888 # ---------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py892 # ---------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py894 # ---------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py904 # ---------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_security.py906 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py690 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py692 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py709 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py712 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py919 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py922 # ---------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_llm_group_overrides.py125# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_llm_group_overrides.py127# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_llm_group_overrides.py234# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_llm_group_overrides.py236# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_llm_group_overrides.py334# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_llm_group_overrides.py336# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_llm_group_overrides.py425# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_llm_group_overrides.py427# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_llm_group_overrides.py458# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_llm_group_overrides.py460# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_llm_group_overrides.py538# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_llm_group_overrides.py540# ---------------------------------------------------------------------------COMMENT
MEDIUM⚡changedetectionio/tests/test_llm_group_overrides.py589# ---------------------------------------------------------------------------COMMENT
151 more matches not shown…
Excessive Try-Catch Wrapping353 hits · 380 pts
SeverityFileLineSnippetContext
MEDIUM⚡changedetectionio/pluggy_interface.py271 print(f"Error loading plugin {module_name}: {e}")CODE
LOWchangedetectionio/pluggy_interface.py332 except Exception as e:CODE
LOWchangedetectionio/pluggy_interface.py534 except Exception as e:CODE
LOWchangedetectionio/pluggy_interface.py558 except Exception as e:CODE
LOWchangedetectionio/pluggy_interface.py675 except Exception as e:CODE
LOW⚡changedetectionio/worker.py799 except Exception as e:CODE
LOW⚡changedetectionio/worker.py812 except Exception as e:CODE
LOW⚡changedetectionio/worker.py825 except Exception as e:CODE
LOWchangedetectionio/worker.py121 except Exception as e:CODE
LOWchangedetectionio/worker.py136 except Exception as health_e:CODE
LOWchangedetectionio/worker.py405 except Exception as e:CODE
LOWchangedetectionio/worker.py532 except Exception as e:CODE
LOWchangedetectionio/worker.py588 except Exception as _fe:CODE
LOWchangedetectionio/worker.py605 except Exception as e:CODE
LOWchangedetectionio/worker.py623 except Exception as e:CODE
LOWchangedetectionio/worker.py636 except Exception as e:CODE
LOWchangedetectionio/worker.py662 except Exception as e:CODE
LOWchangedetectionio/worker.py685 except Exception as e:CODE
LOWchangedetectionio/worker.py708 except Exception as cleanup_error:CODE
LOWchangedetectionio/worker.py721 except Exception as finalize_error:CODE
LOWchangedetectionio/worker.py733 except Exception as release_error:CODE
LOWchangedetectionio/is_safe_url.py110 except Exception as e:CODE
LOWchangedetectionio/rss_tools.py201 except Exception as e:STRING
LOW⚡changedetectionio/worker_pool.py129 except Exception as e:CODE
LOW⚡changedetectionio/worker_pool.py368 except Exception as uuid_e:CODE
LOW⚡changedetectionio/worker_pool.py392 except Exception as e:CODE
LOW⚡changedetectionio/worker_pool.py400 except Exception as health_e:CODE
LOW⚡changedetectionio/worker_pool.py406 except Exception:CODE
LOWchangedetectionio/worker_pool.py81 except Exception as e:CODE
LOWchangedetectionio/worker_pool.py162 except Exception as e:CODE
LOWchangedetectionio/worker_pool.py208 except Exception as e:CODE
LOWchangedetectionio/worker_pool.py266 except Exception as e:CODE
LOWchangedetectionio/worker_pool.py278 except Exception as e:CODE
LOWchangedetectionio/worker_pool.py437 except Exception as e:CODE
LOW⚡changedetectionio/queue_handlers.py258 except Exception as e:CODE
LOW⚡changedetectionio/queue_handlers.py267 except Exception as e:CODE
LOW⚡changedetectionio/queue_handlers.py277 except Exception as e:CODE
LOW⚡changedetectionio/queue_handlers.py548 except Exception as e:CODE
LOW⚡changedetectionio/queue_handlers.py560 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py60 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py76 except Exception:CODE
LOWchangedetectionio/queue_handlers.py89 except Exception as notif_e:CODE
LOWchangedetectionio/queue_handlers.py101 except Exception as signal_e:CODE
LOWchangedetectionio/queue_handlers.py107 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py131 except Exception as signal_e:CODE
LOWchangedetectionio/queue_handlers.py141 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py167 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py210 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py220 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py233 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py307 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py343 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py384 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py395 except Exception:CODE
LOWchangedetectionio/queue_handlers.py412 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py420 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py446 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py468 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py491 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py506 except Exception as e:CODE
293 more matches not shown…
Magic Placeholder Names90 hits · 368 pts
SeverityFileLineSnippetContext
HIGH⚡docs/api-spec.yaml1412 -H "x-api-key: YOUR_API_KEY"CODE
HIGH⚡docs/api-spec.yaml1416 -H "x-api-key: YOUR_API_KEY"CODE
HIGH⚡docs/api-spec.yaml1420 -H "x-api-key: YOUR_API_KEY"CODE
HIGH⚡docs/api-spec.yaml1425 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGH⚡docs/api-spec.yaml2124 -H "x-api-key: YOUR_API_KEY" \CODE
HIGH⚡docs/api-spec.yaml2130 -H "x-api-key: YOUR_API_KEY" \CODE
HIGH⚡docs/api-spec.yaml2136 -H "x-api-key: YOUR_API_KEY" \CODE
HIGH⚡docs/api-spec.yaml2144 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml29 For example: `x-api-key: YOUR_API_KEY`CODE
HIGHdocs/api-spec.yaml162 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml196 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml215 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml239 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml255 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml953 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml958 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1026 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1041 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1099 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1104 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1161 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1173 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1219 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1224 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1257 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1262 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1298 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1303 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1333 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1338 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1616 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1622 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1656 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1661 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1695 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1705 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1745 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1750 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1797 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1808 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1848 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1853 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1880 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1885 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1905 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1918 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1959 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1971 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml2007 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml2019 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml2052 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml2057 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml2233 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml2238 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGH⚡docs/api_v1/index.html1075 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
HIGH⚡docs/api_v1/index.html1079 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
HIGH⚡docs/api_v1/index.html1083 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
HIGHdocs/api_v1/index.html474&lt;p&gt;For example: &lt;code&gt;x-api-key: YOUR_API_KEY&lt;/code&gt;&lt;/p&gt;CODE
HIGHdocs/api_v1/index.html476<p>For example: <code>x-api-key: YOUR_API_KEY</code></p>CODE
HIGHdocs/api_v1/index.html498 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
30 more matches not shown…
Empty Error Handlers63 hits · 315 pts
SeverityFileLineSnippetContext
HIGHchangedetectionio/worker_pool.py270except ValueError:CODE
HIGHchangedetectionio/worker_pool.py106except RuntimeError:CODE
HIGHchangedetectionio/queue_handlers.py395except Exception:CODE
HIGHchangedetectionio/queue_handlers.py76except Exception:CODE
HIGHchangedetectionio/favicon_utils.py31except Exception:CODE
HIGHchangedetectionio/gc_cleanup.py82except (AttributeError, TypeError):CODE
HIGHchangedetectionio/gc_cleanup.py107except (AttributeError, TypeError):CODE
HIGHchangedetectionio/gc_cleanup.py89except (AttributeError, TypeError):CODE
HIGHchangedetectionio/validate_url.py190except Exception:CODE
HIGHchangedetectionio/validate_url.py198except Exception:CODE
HIGHchangedetectionio/__init__.py77except Exception:CODE
HIGHchangedetectionio/flask_app.py1578except:CODE
HIGHchangedetectionio/flask_app.py1584except:CODE
HIGHchangedetectionio/llm/client.py197except Exception:CODE
HIGHchangedetectionio/llm/evaluator.py449except (ValueError, TypeError):CODE
HIGHchangedetectionio/llm/evaluator.py456except (ValueError, TypeError):CODE
HIGHchangedetectionio/browser_steps/browser_steps.py561except:CODE
HIGHchangedetectionio/browser_steps/browser_steps.py555except:CODE
HIGH…ctionio/notification/apprise_plugin/custom_handlers.py152except Exception:CODE
HIGHchangedetectionio/tests/conftest.py220except (ValueError, RuntimeError):CODE
HIGHchangedetectionio/tests/conftest.py452except Exception:CODE
HIGHchangedetectionio/tests/conftest.py460except Exception:CODE
HIGHchangedetectionio/tests/util.py436except (AttributeError, PermissionError):CODE
HIGHchangedetectionio/tests/test_xpath_selector.py627except elementpath.ElementPathError:CODE
HIGHchangedetectionio/tests/test_xpath_selector.py635except elementpath.ElementPathError:CODE
HIGHchangedetectionio/realtime/socket_server.py271except Exception:CODE
HIGHchangedetectionio/processors/__init__.py79except Exception as e:CODE
HIGHchangedetectionio/processors/base.py148except OSError:CODE
HIGHchangedetectionio/processors/base.py141except OSError:CODE
HIGH…ssors/image_ssim_diff/image_handler/isolated_opencv.py168except:CODE
HIGH…ssors/image_ssim_diff/image_handler/isolated_opencv.py324except:CODE
HIGH…ssors/image_ssim_diff/image_handler/isolated_opencv.py455except:CODE
HIGH…ssors/image_ssim_diff/image_handler/isolated_opencv.py599except:CODE
HIGH…sors/image_ssim_diff/image_handler/isolated_libvips.py113except:CODE
HIGH…sors/image_ssim_diff/image_handler/isolated_libvips.py198except:CODE
HIGH…sors/image_ssim_diff/image_handler/isolated_libvips.py321except:CODE
HIGH…angedetectionio/processors/text_json_diff/processor.py336except Exception:CODE
HIGH…ionio/processors/restock_diff/pure_python_extractor.py271except ValueError:CODE
HIGH…ionio/processors/restock_diff/pure_python_extractor.py142except ValueError:CODE
HIGH…ionio/processors/restock_diff/pure_python_extractor.py246except ValueError:CODE
HIGHchangedetectionio/processors/restock_diff/processor.py195except (NameError, UnboundLocalError):CODE
HIGHchangedetectionio/processors/restock_diff/processor.py199except (NameError, UnboundLocalError):CODE
HIGHchangedetectionio/conditions/__init__.py80except (ValueError, TypeError):CODE
HIGHchangedetectionio/conditions/__init__.py177except Exception as e:CODE
HIGHchangedetectionio/model/Tags.py26except FileNotFoundError:CODE
HIGHchangedetectionio/model/__init__.py513except AttributeError:CODE
HIGHchangedetectionio/model/__init__.py540except AttributeError:CODE
HIGHchangedetectionio/model/Watch.py130except Exception:CODE
HIGHchangedetectionio/blueprint/ui/queue.py167except Exception:CODE
HIGHchangedetectionio/blueprint/ui/diff.py40except Exception:CODE
HIGHchangedetectionio/blueprint/settings/llm.py28except Exception:CODE
HIGHchangedetectionio/blueprint/settings/llm.py45except Exception:CODE
HIGHchangedetectionio/blueprint/imports/importer.py139except KeyError:CODE
HIGHchangedetectionio/blueprint/imports/importer.py141except IndexError:CODE
HIGHchangedetectionio/blueprint/imports/importer.py149except KeyError:CODE
HIGHchangedetectionio/blueprint/imports/importer.py151except IndexError:CODE
HIGHchangedetectionio/blueprint/watchlist/__init__.py181except Exception:CODE
HIGHchangedetectionio/store/updates.py115except:CODE
HIGHchangedetectionio/store/file_saving_datastore.py126except (OSError, AttributeError):CODE
HIGHchangedetectionio/store/file_saving_datastore.py146except:CODE
3 more matches not shown…
Unused Imports307 hits · 286 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/worker.py330CODE
LOWchangedetectionio/worker.py406CODE
LOWchangedetectionio/worker.py459CODE
LOWchangedetectionio/queue_handlers.py3CODE
LOWchangedetectionio/gc_cleanup.py9CODE
LOWchangedetectionio/validate_url.py3CODE
LOWchangedetectionio/forms.py22CODE
LOWchangedetectionio/forms.py550CODE
LOWchangedetectionio/auth_decorator.py3CODE
LOWchangedetectionio/auth_decorator.py4CODE
LOWchangedetectionio/time_handler.py2CODE
LOWchangedetectionio/languages.py5CODE
LOWchangedetectionio/llm/evaluator.py40CODE
LOW…angedetectionio/content_fetchers/screenshot_handler.py9CODE
LOWchangedetectionio/content_fetchers/__init__.py4CODE
LOWchangedetectionio/content_fetchers/__init__.py11CODE
LOWchangedetectionio/content_fetchers/__init__.py30CODE
LOWchangedetectionio/content_fetchers/__init__.py192CODE
LOWchangedetectionio/content_fetchers/__init__.py185CODE
LOWchangedetectionio/content_fetchers/__init__.py188CODE
LOWchangedetectionio/content_fetchers/puppeteer.py9CODE
LOWchangedetectionio/content_fetchers/requests.py3CODE
LOWchangedetectionio/content_fetchers/requests.py12CODE
LOWchangedetectionio/content_fetchers/requests.py40CODE
LOWchangedetectionio/content_fetchers/requests.py40CODE
LOWchangedetectionio/content_fetchers/requests.py40CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py4CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py33CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py34CODE
LOWchangedetectionio/notification/handler.py311CODE
LOWchangedetectionio/notification/handler.py313CODE
LOW…angedetectionio/notification/apprise_plugin/discord.py61CODE
LOW…angedetectionio/notification/apprise_plugin/discord.py61CODE
LOW…ctionio/notification/apprise_plugin/custom_handlers.py53CODE
LOW…ctionio/notification/apprise_plugin/custom_handlers.py63CODE
LOWchangedetectionio/tests/test_rss_reader_mode.py3CODE
LOWchangedetectionio/tests/test_rss_reader_mode.py7CODE
LOWchangedetectionio/tests/test_rss_reader_mode.py7CODE
LOWchangedetectionio/tests/test_rss_reader_mode.py7CODE
LOWchangedetectionio/tests/test_rss_reader_mode.py7CODE
LOWchangedetectionio/tests/test_rss_reader_mode.py7CODE
LOWchangedetectionio/tests/test_queue_handler.py4CODE
LOWchangedetectionio/tests/test_queue_handler.py4CODE
LOWchangedetectionio/tests/test_queue_handler.py5CODE
LOWchangedetectionio/tests/test_preview_endpoints.py3CODE
LOWchangedetectionio/tests/test_preview_endpoints.py5CODE
LOWchangedetectionio/tests/test_preview_endpoints.py5CODE
LOWchangedetectionio/tests/test_preview_endpoints.py5CODE
LOWchangedetectionio/tests/test_backend.py6CODE
LOWchangedetectionio/tests/test_backend.py6CODE
LOWchangedetectionio/tests/test_lxml_concurrency.py17CODE
LOWchangedetectionio/tests/test_api_openapi.py9CODE
LOWchangedetectionio/tests/test_api_openapi.py12CODE
LOWchangedetectionio/tests/test_api_openapi.py12CODE
LOWchangedetectionio/tests/test_access_control.py1CODE
LOWchangedetectionio/tests/test_access_control.py5CODE
LOWchangedetectionio/tests/test_ignore_regex_text.py3CODE
LOWchangedetectionio/tests/test_security.py3CODE
LOWchangedetectionio/tests/test_security.py11CODE
LOWchangedetectionio/tests/test_security.py388CODE
247 more matches not shown…
Self-Referential Comments55 hits · 151 pts
SeverityFileLineSnippetContext
MEDIUM.github/workflows/test-stack-reusable-workflow.yml464 # Create a watch via API through nginx proxy subpathCOMMENT
MEDIUM.github/workflows/test-stack-reusable-workflow.yml800 # Create a watch with tag "github-group-test" via APICOMMENT
MEDIUM.github/workflows/test-stack-reusable-workflow.yml814 # Create a specific test URL watchCOMMENT
MEDIUMchangedetectionio/is_safe_url.py93 # Create a URL adapter bound to the server nameCOMMENT
MEDIUMchangedetectionio/worker_pool.py55 # Create a new event loop for this threadCOMMENT
MEDIUMchangedetectionio/gc_cleanup.py53 # Create a new thread local object to encourage cleanup of old onesCOMMENT
MEDIUMchangedetectionio/__init__.py327 # Create the datadir if it doesnt existCOMMENT
MEDIUMchangedetectionio/test_cli_opts.sh148 # Create a watch using CLI, then recheck itCOMMENT
MEDIUMchangedetectionio/flask_app.py205 # Create a ChoiceLoader that searches app templates first, then plugin templatesCOMMENT
MEDIUMchangedetectionio/notification/handler.py108 # Define the mapping between your placeholders and markdown markersCOMMENT
MEDIUMchangedetectionio/notification/handler.py132 # Define the mapping between your placeholders and markdown markersCOMMENT
MEDIUMchangedetectionio/tests/test_security.py958 # Create a real watch and trigger a check so we have a valid backup structureCOMMENT
MEDIUMchangedetectionio/tests/test_rss_group.py47 # Create a tag/groupSTRING
MEDIUMchangedetectionio/tests/test_rss_group.py160 # Create a tag with no watchesSTRING
MEDIUMchangedetectionio/tests/test_rss_group.py197 # Create a tagSTRING
MEDIUMchangedetectionio/tests/test_tag_colour.py83 # Creating a tag with a bad colour in one shot must fail tooCOMMENT
MEDIUM⚡changedetectionio/tests/test_api_security.py50 # Create a valid watch firstSTRING
MEDIUMchangedetectionio/tests/test_api_security.py333 # Create a watchSTRING
MEDIUMchangedetectionio/tests/test_basic_socketio.py24 # Create a test client for SocketIOCOMMENT
MEDIUM⚡changedetectionio/tests/test_commit_persistence.py28 # Create a watchCOMMENT
MEDIUMchangedetectionio/tests/test_commit_persistence.py519 # Create a tagCOMMENT
MEDIUM…ctionio/tests/test_api_notification_urls_validation.py128 # Create a tagCOMMENT
MEDIUMchangedetectionio/tests/test_backup.py138 # Create a full backupCOMMENT
MEDIUMchangedetectionio/tests/test_llm_api_key_security.py754 # Create a real watch — required to exercise llm_clear_summary_cache'sCOMMENT
MEDIUMchangedetectionio/tests/test_llm_token_budget.py67 # Create a watch via APICOMMENT
MEDIUMchangedetectionio/tests/test_tag_url_match.py22 # Create a tag with a URL match patternCOMMENT
MEDIUMchangedetectionio/tests/test_api.py65 # Create a watchSTRING
MEDIUMchangedetectionio/tests/test_api.py635 # Create a watchCOMMENT
MEDIUMchangedetectionio/tests/test_api.py1014 # Create a watch in restock_diff mode WITH processor_config in the POST body (matches the API docs example)COMMENT
MEDIUMchangedetectionio/tests/test_api.py1198 # Create a watchCOMMENT
MEDIUM…detectionio/tests/test_settings_tag_force_reprocess.py99 # Create a tagSTRING
MEDIUM…detectionio/tests/test_settings_tag_force_reprocess.py169 # Create a tagSTRING
MEDIUMchangedetectionio/tests/test_jinja2.py250 # Create a large input string (over 10MB)COMMENT
MEDIUMchangedetectionio/tests/test_jinja2.py286 # Create a template with the dangerous patternCOMMENT
MEDIUMchangedetectionio/tests/test_api_tags.py100 # Create a watch with the tag and check it matches UUIDCOMMENT
MEDIUMchangedetectionio/tests/test_api_tags.py188 # Create a tag with processor_config_restock_diff in a single POST (issue #3966)COMMENT
MEDIUMchangedetectionio/tests/test_llm_change_summary.py78 # Create a tag with llm_change_summary, AI set to On so its watches inherit itCOMMENT
MEDIUMchangedetectionio/tests/unit/test_watch_model.py225 # Create a watch with large datastore (many watches)COMMENT
MEDIUMchangedetectionio/tests/unit/test_conditions.py14 # Create a temporary directory for the test datastoreCOMMENT
MEDIUM…ngedetectionio/tests/unit/test_temporary_watch_seed.py108 # Create a watch and drop a preload bundle into its data_dir, as the Add WatchCOMMENT
MEDIUMchangedetectionio/realtime/socket_server.py202 # Create a simplified watch data object to send to clientsCOMMENT
MEDIUMchangedetectionio/realtime/socket_server.py413 # Create a dedicated signal handler that will receive signals and emit them to clientsCOMMENT
MEDIUM⚡changedetectionio/processors/__init__.py469 # Create a processor instance to access config methodsCOMMENT
MEDIUMchangedetectionio/processors/base.py35 # Create a stable snapshot of the watch for processingCOMMENT
MEDIUMchangedetectionio/conditions/blueprint.py43 # Create a temporary watch data structure with this single ruleCOMMENT
MEDIUMchangedetectionio/conditions/blueprint.py54 # Create a temporary application data structure for the rule checkCOMMENT
MEDIUMchangedetectionio/conditions/__init__.py29# Define the extended operations dictionaryCOMMENT
MEDIUMchangedetectionio/conditions/__init__.py145 # Create the rulesetCOMMENT
MEDIUMchangedetectionio/model/__init__.py443 # Create a cached version if it doesn't existCOMMENT
MEDIUMchangedetectionio/model/Watch.py999 # Create a smaller intermediate image (to reduce memory usage)COMMENT
MEDIUMchangedetectionio/api/Watch.py109 # Create a dict copy for JSON response (with lock for thread safety)COMMENT
MEDIUMchangedetectionio/blueprint/ui/edit.py162 # Create a processor instance to access config methodsCOMMENT
MEDIUMchangedetectionio/blueprint/browser_steps/__init__.py438 # Create the response with ETagCOMMENT
MEDIUMchangedetectionio/blueprint/backups/__init__.py61 # Create a list file with just the URLs, so it's easier to port somewhere else in the futureCOMMENT
MEDIUMchangedetectionio/store/__init__.py59 # Initialize parent classCOMMENT
Deep Nesting146 hits · 125 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/pluggy_interface.py244CODE
LOWchangedetectionio/pluggy_interface.py371CODE
LOWchangedetectionio/pluggy_interface.py563CODE
LOWchangedetectionio/worker.py47CODE
LOWchangedetectionio/worker_pool.py134CODE
LOWchangedetectionio/worker_pool.py519CODE
LOWchangedetectionio/queue_handlers.py237CODE
LOWchangedetectionio/queue_handlers.py281CODE
LOWchangedetectionio/queue_handlers.py311CODE
LOWchangedetectionio/queue_handlers.py347CODE
LOWchangedetectionio/gc_cleanup.py12CODE
LOWchangedetectionio/__init__.py199CODE
LOWchangedetectionio/forms.py131CODE
LOWchangedetectionio/forms.py682CODE
LOWchangedetectionio/html_tools.py332CODE
LOWchangedetectionio/html_tools.py375CODE
LOWchangedetectionio/html_tools.py613CODE
LOWchangedetectionio/html_tools.py723CODE
LOWchangedetectionio/html_tools.py913CODE
LOWchangedetectionio/auth_decorator.py16CODE
LOWchangedetectionio/auth_decorator.py23CODE
LOWchangedetectionio/custom_queue.py91CODE
LOWchangedetectionio/custom_queue.py155CODE
LOWchangedetectionio/custom_queue.py249CODE
LOWchangedetectionio/custom_queue.py414CODE
LOWchangedetectionio/custom_queue.py496CODE
LOWchangedetectionio/languages.py166CODE
LOWchangedetectionio/flask_app.py772CODE
LOWchangedetectionio/flask_app.py1591CODE
LOWchangedetectionio/flask_app.py1666CODE
LOWchangedetectionio/flask_app.py853CODE
LOWchangedetectionio/flask_app.py1140CODE
LOWchangedetectionio/flask_app.py1450CODE
LOWchangedetectionio/translations_overlay/manage.py53CODE
LOWchangedetectionio/llm/client.py79CODE
LOWchangedetectionio/content_fetchers/__init__.py39CODE
LOWchangedetectionio/content_fetchers/puppeteer.py278CODE
LOWchangedetectionio/content_fetchers/puppeteer.py427CODE
LOWchangedetectionio/content_fetchers/requests.py24CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py63CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py81CODE
LOWchangedetectionio/content_fetchers/base.py208CODE
LOWchangedetectionio/notification/handler.py151CODE
LOWchangedetectionio/notification/handler.py207CODE
LOWchangedetectionio/notification/handler.py306CODE
LOW…angedetectionio/notification/apprise_plugin/discord.py56CODE
LOW…angedetectionio/notification/apprise_plugin/discord.py200CODE
LOWchangedetectionio/tests/conftest.py43CODE
LOWchangedetectionio/tests/conftest.py405CODE
LOWchangedetectionio/tests/conftest.py440CODE
LOWchangedetectionio/tests/util.py266CODE
LOWchangedetectionio/tests/util.py303CODE
LOWchangedetectionio/tests/test_history_consistency.py13CODE
LOWchangedetectionio/tests/test_basic_socketio.py13CODE
LOWchangedetectionio/tests/test_llm_summary_async.py103CODE
LOWchangedetectionio/tests/test_pwa_manifest.py97CODE
LOW…ngedetectionio/tests/unit/test_auth_decorator_order.py50CODE
LOWchangedetectionio/tests/unit/test_fetch_url_gate.py218CODE
LOWchangedetectionio/tests/smtp/smtp-test-server.py17CODE
LOWchangedetectionio/diff/__init__.py79CODE
86 more matches not shown…
Redundant / Tautological Comments70 hits · 112 pts
SeverityFileLineSnippetContext
LOW.github/workflows/test-stack-reusable-workflow.yml164 # Check if RSS is less than 100MBCOMMENT
LOW⚡changedetectionio/pluggy_interface.py289 # Check if plugin has datastore attribute and it's not setCOMMENT
LOWchangedetectionio/pluggy_interface.py399 # Check if the result has any meaningful dataCOMMENT
LOWchangedetectionio/pluggy_interface.py596 # Check if plugin has a templates directoryCOMMENT
LOW⚡changedetectionio/worker.py757 # Check if we should restart (only when idle, between jobs)COMMENT
LOW⚡changedetectionio/worker.py766 # Check if we should exitCOMMENT
LOW⚡changedetectionio/worker.py770 # Check if we're in pytest environment - if so, be more gentle with loggingCOMMENT
LOW⚡changedetectionio/worker_pool.py138 # Check if we're in pytest environment - if so, be more gentle with loggingCOMMENT
LOW⚡changedetectionio/worker_pool.py416 # Check if we're in pytest environment - if so, be more gentle with loggingCOMMENT
LOWchangedetectionio/queue_handlers.py458 # Check if all notifications are mutedCOMMENT
LOWchangedetectionio/queue_handlers.py482 # Check if all notifications are mutedCOMMENT
LOWchangedetectionio/gc_cleanup.py68 # Check if lxml.etree is in useCOMMENT
LOWchangedetectionio/gc_cleanup.py95 # Check if lxml.html is in useCOMMENT
LOWchangedetectionio/gc_cleanup.py117 # Check if json module is being used and try to clear its cacheCOMMENT
LOWchangedetectionio/__init__.py593 # Check if we need to repeatCOMMENT
LOWchangedetectionio/html_tools.py285 # Iterate over the list of XPath selectorsCOMMENT
LOWchangedetectionio/time_handler.py78 # Check if the current day matches the target day or overlaps due to durationCOMMENT
LOWchangedetectionio/languages.py179 # Check if messages.po existsCOMMENT
LOWchangedetectionio/flask_app.py647 # Check if it's a built-in fetcherCOMMENT
LOWchangedetectionio/flask_app.py1012 # Check if there's a redirect parameter to return to after re-loginCOMMENT
LOWchangedetectionio/flask_app.py1046 # Check if there's a redirect parameter to return to the same pageCOMMENT
LOWchangedetectionio/flask_app.py1264 # Check if file exists in plugin's static directoryCOMMENT
LOWchangedetectionio/flask_app.py1741 # Check if all checks are paused - this loop could get stuck on very long lists of watches, best to check heCOMMENT
LOW⚡changedetectionio/browser_steps/browser_steps.py146 # Check if navigation actually occurredCOMMENT
LOWchangedetectionio/browser_steps/browser_steps.py124 # Check if action handler existsCOMMENT
LOWchangedetectionio/browser_steps/browser_steps.py490 # Check if session has expired based on ageCOMMENT
LOWchangedetectionio/content_fetchers/playwright.py57 # Set viewport to a larger size to capture more content at onceCOMMENT
LOW…angedetectionio/notification/apprise_plugin/discord.py43 # Check if body contains our diff placeholdersCOMMENT
LOW…angedetectionio/notification/apprise_plugin/discord.py116 # Check if we're approaching the embed count limitCOMMENT
LOW…angedetectionio/notification/apprise_plugin/discord.py127 # Check if adding this embed would exceed total character limitCOMMENT
LOWchangedetectionio/tests/test_commit_persistence.py437 # Set browser_steps to meaningless valuesCOMMENT
LOWchangedetectionio/tests/test_i18n.py192 # Set language to ItalianCOMMENT
LOWchangedetectionio/tests/test_i18n.py702 # Set language to GermanCOMMENT
LOWchangedetectionio/tests/test_rss_tag_token.py27 # Assign tag to watchCOMMENT
LOWchangedetectionio/tests/unit/test_time_handler.py94 # Set schedule to start 23:30 with 120 minute duration (crosses midnight)COMMENT
LOWchangedetectionio/tests/unit/test_time_handler.py177 # Set time to current hourCOMMENT
LOWchangedetectionio/tests/unit/test_time_handler.py513 # Set time to 3 hours agoCOMMENT
LOWchangedetectionio/diff/__init__.py135 # Check if there are any changesCOMMENT
LOWchangedetectionio/diff/__init__.py141 # Check if the whole line is replaced (no unchanged content)COMMENT
LOWchangedetectionio/diff/__init__.py270 # Check if there are any changesCOMMENT
LOWchangedetectionio/diff/__init__.py406 # Check if there are any actual changes (not just whitespace when ignore_junk is enabled)COMMENT
LOWchangedetectionio/realtime/events.py22 # Check if watch existsCOMMENT
LOWchangedetectionio/realtime/socket_server.py379 # Check if authentication is required and user is not authenticatedCOMMENT
LOW⚡changedetectionio/processors/__init__.py205 # Check if DISABLED_PROCESSORS env var is setCOMMENT
LOWchangedetectionio/processors/__init__.py222 # Check if this is a plugin processorCOMMENT
LOW…ngedetectionio/processors/image_ssim_diff/processor.py62 # Check if bounding box is set (for drawn area mode)COMMENT
LOW…ngedetectionio/processors/image_ssim_diff/processor.py146 # Check if this is the first check (no previous history)COMMENT
LOW…ngedetectionio/processors/image_ssim_diff/edit_hook.py38 # Check if template matching is globally enabled via ENV varCOMMENT
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py45 # Check if decoding succeededCOMMENT
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py150 # Check if result is an error dictCOMMENT
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py306 # Check if result is an error dictCOMMENT
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py436 # Check if result is an error dictCOMMENT
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py581 # Check if result is an error dictCOMMENT
LOW…ssors/image_ssim_diff/image_handler/libvips_handler.py285 # Check if match is good enough (80% confidence threshold)COMMENT
LOW…ngedetectionio/processors/text_json_diff/difference.py152 # Check if this is a user submission (any diff pref param exists in query string)COMMENT
LOW…angedetectionio/processors/text_json_diff/processor.py184 # Check if it's perl-style regex /.../COMMENT
LOW…ionio/processors/restock_diff/pure_python_extractor.py38 # Check if this is a JSON-LD script tagCOMMENT
LOWchangedetectionio/model/__init__.py313 # Check if we're being initialized from an existing watch objectCOMMENT
LOWchangedetectionio/model/__init__.py455 # Check if it's a property descriptorCOMMENT
LOWchangedetectionio/model/Watch.py630 # Check if binary file (image, PDF, etc.)COMMENT
10 more matches not shown…
Cross-Language Confusion20 hits · 95 pts
SeverityFileLineSnippetContext
HIGHchangedetectionio/forms.py605 f"The following tokens used in the notification are not valid: {undefined}"CODE
HIGHchangedetectionio/notification/handler.py477#@todo on null:// (only if its a 1 url with null) probably doesnt need to actually .add/setup/etcCOMMENT
HIGHchangedetectionio/tests/test_jsonpath_jq_selector.py179 nested = ('{"count": 3, "flag": null, "ok": true, 'STRING
HIGHchangedetectionio/tests/test_api_security.py499 # Should accept (empty is valid as null)STRING
HIGHchangedetectionio/tests/test_api.py1231 - CREATE endpoint rejects null, empty, and invalid URLsSTRING
HIGHchangedetectionio/tests/test_api.py1232 - UPDATE endpoint rejects attempts to change URL to null, empty, or invalidSTRING
HIGHchangedetectionio/tests/test_xpath_selector_unit.py142 ("manager[1]/@name || manager[2]/@name", "GodotFreya"),CODE
HIGH⚡changedetectionio/tests/test_llm_change_summary.py159 return JSON {"summary": null, "error": "<readable message>"} with a 500STRING
HIGH⚡changedetectionio/tests/llm/test_response_parser.py231 raw = '{"needs_prefilter": false, "selector": null, "reason": "intent is global"}'CODE
HIGH⚡changedetectionio/tests/llm/test_response_parser.py237 raw = '{"needs_prefilter": "false", "selector": null, "reason": "global"}'CODE
HIGH⚡changedetectionio/tests/llm/test_llm_restock_plugin.py141 llm_json = '{"price": null, "currency": null, "availability": "instock"}'CODE
HIGH⚡changedetectionio/tests/llm/test_llm_restock_plugin.py151 llm_json = '{"price": 19.95, "currency": "GBP", "availability": null}'CODE
HIGH⚡changedetectionio/tests/llm/test_llm_restock_plugin.py161 llm_json = '{"price": null, "currency": null, "availability": null}'CODE
HIGH⚡changedetectionio/tests/llm/test_llm_restock_plugin.py213 llm_json = '{"price": null, "currency": null, "availability": null}'CODE
HIGHchangedetectionio/api/Import.py43 - anyOf: [{type: string}, {type: null}] (anyOf format)STRING
HIGH⚡changedetectionio/blueprint/ui/diff.py494 202 {"summary": null, "status": "pending", still generatingSTRING
HIGH⚡changedetectionio/blueprint/ui/diff.py496 200 {"summary": null, "status": "idle"} nothing running - re-POSTSTRING
HIGH⚡changedetectionio/blueprint/ui/diff.py497 4xx/5xx {"summary": null, "error": "...", "status": "error"} the job failedSTRING
HIGHchangedetectionio/blueprint/ui/diff.py369 202 {"summary": null, "status": "pending", generating, poll the GETSTRING
HIGHchangedetectionio/blueprint/ui/diff.py371 4xx/5xx {"summary": null, "error": "...", "status": "error"} cannot be generatedSTRING
Cross-File Repetition18 hits · 90 pts
SeverityFileLineSnippetContext
HIGHchangedetectionio/tests/test_ignore.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGH…ngedetectionio/tests/test_trigger_regex_with_filter.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_ignorestatuscode.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGH…angedetectionio/tests/test_block_while_text_present.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_conditions.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_ignorewhitespace.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_trigger_regex.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_ignore_text.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_trigger.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_restock_itemprop.py0<html> <body> some new nice initial text<br> <p>which is across multiple lines</p> <br> add to cart <br> so let's see whSTRING
HIGHchangedetectionio/tests/test_extract_regex.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> <div id="STRING
HIGH…etectionio/tests/test_automatic_follow_ldjson_price.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> <div id="STRING
HIGHchangedetectionio/tests/test_xpath_selector.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> <div id="STRING
HIGHchangedetectionio/tests/test_css_selector.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> <div id="STRING
HIGHchangedetectionio/tests/test_api.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> <div id="STRING
HIGHchangedetectionio/api/Tags.py0background thread to queue all watches - discarded after completion.STRING
HIGHchangedetectionio/blueprint/ui/__init__.py0background thread to queue all watches - discarded after completion.STRING
HIGHchangedetectionio/api/Watch.py0background thread to queue all watches - discarded after completion.STRING
Over-Commented Block74 hits · 66 pts
SeverityFileLineSnippetContext
LOWrequirements.txt61beautifulsoup4<=4.15.0,>=4.15.0COMMENT
LOWdocker-entrypoint.sh1#!/bin/bashCOMMENT
LOWdocker-compose.yml1services:COMMENT
LOWdocker-compose.yml21 # Example: Install the OSINT reconnaissance processor pluginCOMMENT
LOWdocker-compose.yml41 #COMMENT
LOWdocker-compose.yml61 # - HIDE_REFERER=trueCOMMENT
LOWdocker-compose.yml81 #COMMENT
LOWdocker-compose.yml101 #COMMENT
LOWdocker-compose.yml121COMMENT
LOWdocker-compose.yml141# restart: unless-stoppedCOMMENT
LOWdocker-compose.yml161# --headlessCOMMENT
LOWdocs/api-spec.yaml861 type: stringCOMMENT
LOW.github/workflows/codeql-analysis.yml1# For most projects, this workflow file will not need changing; you simply needCOMMENT
LOW.github/workflows/codeql-analysis.yml61 # 📚 https://git.io/JvXDlCOMMENT
LOW.github/workflows/test-only.yml81 persist-credentials: falseCOMMENT
LOW.github/actions/extract-memory-report/action.yml41# sed 's/.*Peak memory: //' | \COMMENT
LOWchangedetectionio/validate_url.py61 return normalizedCOMMENT
LOWchangedetectionio/__init__.py21# Note: store and changedetection_app are imported inside main() to avoidCOMMENT
LOWchangedetectionio/__init__.py41# - Consistent across all platforms (Windows already uses spawn by default)COMMENT
LOWchangedetectionio/forms.py461 self.message = messageCOMMENT
LOWchangedetectionio/forms.py841 url = StringField('URL', validators=[validateURL()])COMMENT
LOWchangedetectionio/forms.py881COMMENT
LOWchangedetectionio/html_tools.py21# watch's page ends up inside another watch's snapshot.COMMENT
LOWchangedetectionio/languages.py61#COMMENT
LOWchangedetectionio/flask_app.py161# That gives deployments an optional overlay layer: a catalog holding only the handful of msgidsCOMMENT
LOWchangedetectionio/flask_app.py221notification_debug_log = []COMMENT
LOWchangedetectionio/flask_app.py861 # Handled by static_content handlerCOMMENT
LOWchangedetectionio/llm/client.py21DEFAULT_TIMEOUT = int(os.getenv('LLM_TIMEOUT', 300))COMMENT
LOWchangedetectionio/llm/evaluator.py261 return llm_client.DEFAULT_TIMEOUTCOMMENT
LOWchangedetectionio/content_fetchers/puppeteer.py401 # Re-use as much code from browser steps as possible so its the sameCOMMENT
LOWchangedetectionio/content_fetchers/puppeteer.py441 try:COMMENT
LOWchangedetectionio/content_fetchers/puppeteer.py481 # fetcher. The fetch dies at PUPPETEER_MAX_PROCESSING_TIMEOUT_SECONDS havingCOMMENT
LOWchangedetectionio/content_fetchers/puppeteer.py501 # goto() happens to return. This app compares the text of the page the browser ends up on,COMMENT
LOW…ngedetectionio/content_fetchers/res/favicon-fetcher.js61 // and a worker the whole time. Simply capping the total made it worse: giving up earlyCOMMENT
LOW…etectionio/tests/test_automatic_follow_ldjson_price.py201COMMENT
LOW…etectionio/tests/test_automatic_follow_ldjson_price.py221 # },COMMENT
LOWchangedetectionio/tests/test_restock_itemprop.py301 # PROOF that the threshold is measured "since the PREVIOUS check" and NOT "since the first check":COMMENT
LOWchangedetectionio/tests/proxy_list/conftest.py1#!/usr/bin/env python3COMMENT
LOWchangedetectionio/tests/custom_browser_url/__init__.py1# placeholderCOMMENT
LOWchangedetectionio/processors/restock_diff/processor.py61COMMENT
LOWchangedetectionio/processors/restock_diff/processor.py81# Why Multiprocessing Fixes This:COMMENT
LOWchangedetectionio/processors/restock_diff/processor.py101# -------------------COMMENT
LOWchangedetectionio/processors/restock_diff/processor.py441 self.screenshot = self.fetcher.screenshotCOMMENT
LOWchangedetectionio/static/js/csrf.js1// Attach the CSRF token to every state-changing jQuery request.COMMENT
LOWchangedetectionio/static/js/scrollable-title.js1// The watch title in the top menu is a horizontal scroll container (seeCOMMENT
LOWchangedetectionio/static/styles/scss/diff.scss1@use "settings" as *;COMMENT
LOWchangedetectionio/static/styles/scss/diff.scss21// the gradient to that edge and push it up by the bar's own offset, and the barCOMMENT
LOWchangedetectionio/static/styles/scss/diff.scss101 }COMMENT
LOWchangedetectionio/static/styles/scss/diff.scss121 //COMMENT
LOWchangedetectionio/static/styles/scss/diff.scss141COMMENT
LOWchangedetectionio/static/styles/scss/diff.scss161 // viewports at three device pixel ratios that number is 0.813, 0.203 orCOMMENT
LOWchangedetectionio/static/styles/scss/diff.scss181 // is sticky it is invisible, and a device-pixel diff of the seam band atCOMMENT
LOWchangedetectionio/static/styles/scss/diff.scss201#diff-header {COMMENT
LOWchangedetectionio/static/styles/scss/diff.scss221 align-self: stretch;COMMENT
LOWchangedetectionio/static/styles/scss/diff.scss241 //COMMENT
LOWchangedetectionio/static/styles/scss/diff.scss261 // A centered flex item is sized to fit-content, which has a min-contentCOMMENT
LOWchangedetectionio/static/styles/scss/diff.scss281 // which is how a phone showed one row in a screenshot and a vertical stack inCOMMENT
LOWchangedetectionio/static/styles/scss/diff.scss301 // label - measures over it and wraps to three. Neutralising just that ruleCOMMENT
LOWchangedetectionio/static/styles/scss/diff.scss321 // then taller than 50svh minus the top menu. With overflow: auto on the barCOMMENT
LOWchangedetectionio/static/styles/scss/diff.scss481}COMMENT
14 more matches not shown…
Docstring Block Structure8 hits · 40 pts
SeverityFileLineSnippetContext
HIGHchangedetectionio/is_safe_url.py22 Validate that a redirect URL is safe to prevent open redirect vulnerabilities. This follows Flask/Werkzeug besSTRING
HIGHchangedetectionio/queue_handlers.py172 Efficient async get using executor for blocking call. HYBRID APPROACH: Best of both worlds - USTRING
HIGHchangedetectionio/diff/tokenizers/natural_text.py12 Split text into words using simple whitespace boundaries. This is a simpler tokenizer that treats all whitespaSTRING
HIGHchangedetectionio/diff/tokenizers/words_and_html.py14 Split text into words and boundaries (spaces, HTML tags). This tokenizer preserves HTML tags as atomic units wSTRING
HIGHchangedetectionio/processors/restock_diff/processor.py206 Extract itemprop availability with hybrid approach for memory efficiency. Strategy (fastest to slowest, least STRING
HIGHchangedetectionio/jinja2_custom/plugins/datetime_fmt.py87 Format a Unix timestamp as a human-readable datetime. Args: value: timestamp as int/float/string, or tSTRING
HIGHchangedetectionio/model/persistence.py13 Determine entity type from class hierarchy (cached at class level). Args: cls: The class to inspect STRING
HIGHchangedetectionio/model/Watch.py56 Save compressed data using native brotli with streaming compression. Uses chunked compression to minimize peak STRING
Fake / Example Data33 hits · 36 pts
SeverityFileLineSnippetContext
LOW⚡changedetectionio/forms.py1113 self.time_schedule_limit.form.timezone.render_kw['placeholder'] = default_tzCODE
LOW⚡changedetectionio/forms.py1119 proxy_name = StringField(_l('Name'), [validators.Optional()], render_kw={"placeholder": _l("Name")})CODE
LOW⚡changedetectionio/forms.py1128 ], render_kw={"placeholder": "socks5:// or regular proxy http://user:pass@...:3128", "size":50})CODE
LOW⚡changedetectionio/forms.py1131 browser_name = StringField(_l('Name'), [validators.Optional()], render_kw={"placeholder": _l("Name")})CODE
LOW⚡changedetectionio/forms.py1140 ], render_kw={"placeholder": "wss://brightdata... wss://oxylabs etc", "size":50})CODE
LOW⚡changedetectionio/forms.py1143 html_requests = StringField(_l('Plaintext requests'), validators=[validators.Optional()], render_kw={"placeholder": CODE
LOW⚡changedetectionio/forms.py1145 html_webdriver = StringField(_l('Chrome requests'), validators=[validators.Optional()], render_kw={"placeholder"CODE
LOW⚡changedetectionio/forms.py1316 render_kw={"placeholder": "5", "style": "width: 6em;"},CODE
LOW⚡changedetectionio/forms.py1323 "placeholder": DEFAULT_CHANGE_SUMMARY_PROMPT,CODE
LOW⚡changedetectionio/forms.py1333 "placeholder": "0 = unlimited",CODE
LOWchangedetectionio/forms.py923 render_kw={"placeholder": os.getenv('BASE_URL', _l('Not set'))})CODE
LOWchangedetectionio/forms.py938 selector = StringField(_l('Selector'), [validators.Optional()], render_kw={"placeholder": _l("CSS or xPath selector"CODE
LOWchangedetectionio/forms.py939 optional_value = StringField(_l('value'), [validators.Optional()], render_kw={"placeholder": _l("Value")})CODE
LOWchangedetectionio/forms.py963 render_kw={"rows": "5", "placeholder": LLM_INTENT_WATCH_PLACEHOLDER})CODE
LOWchangedetectionio/forms.py966 render_kw={"rows": "5", "placeholder": DEFAULT_CHANGE_SUMMARY_PROMPT},CODE
LOWchangedetectionio/forms.py1197 render_kw={"placeholder": os.getenv('BASE_URL', _l('Not set'))}CODE
LOWchangedetectionio/forms.py1213 render_kw={"placeholder": "0.1", "style": "width: 8em;"}CODE
LOWchangedetectionio/forms.py1224 rss_template_override = TextAreaField(_l('RSS "System default" template override'), render_kw={"rows": "5", "placehoCODE
LOWchangedetectionio/forms.py1263 render_kw={"placeholder": "gpt-4o-mini", "style": "width: 24em;"},CODE
LOWchangedetectionio/forms.py1293 "placeholder": "http://localhost:11434 (Ollama / custom endpoints only)",CODE
LOWchangedetectionio/forms.py1348 "placeholder": "100000",CODE
LOWchangedetectionio/tests/test_llm_token_budget.py132 "llm_evaluation_cache": {"fake_key": {"important": True}},CODE
LOWchangedetectionio/processors/image_ssim_diff/forms.py52 render_kw={"placeholder": "Use global default (0.1)"}CODE
LOW⚡changedetectionio/processors/restock_diff/forms.py22 render_kw={"placeholder": _l("No limit"), "size": "10"})CODE
LOW⚡changedetectionio/processors/restock_diff/forms.py24 render_kw={"placeholder": _l("No limit"), "size": "10"})CODE
LOW⚡changedetectionio/processors/restock_diff/forms.py29 ], render_kw={"placeholder": "0%", "size": "5"})CODE
LOWchangedetectionio/static/js/scheduler.js35 $('#local-time-in-tz').text(getTimeInTimezone(timezone_text_widget.attr('placeholder')));CODE
LOWchangedetectionio/conditions/form.py23 value = StringField(_l("Value"), validators=[validators.Optional()], render_kw={"placeholder": _l("A value")})CODE
LOW…angedetectionio/templates/edit/include_llm_intent.html164 {% set summary_placeholder = form.llm_change_summary.render_kw['placeholder'] %}CODE
LOWchangedetectionio/blueprint/tags/form.py25 render_kw={"placeholder": _l("e.g. *://example.com/* or github.com/myorg")})CODE
LOWchangedetectionio/blueprint/tags/form.py49 render_kw={"rows": "5", "placeholder": LLM_INTENT_TAG_PLACEHOLDER})CODE
LOWchangedetectionio/blueprint/tags/form.py53 render_kw={"rows": "5", "placeholder": DEFAULT_CHANGE_SUMMARY_PROMPT},CODE
LOWchangedetectionio/blueprint/tags/form.py67 name = StringField(_l('Tag name'), [validators.InputRequired()], render_kw={"placeholder": _l("Name")})CODE
Structural Annotation Overuse19 hits · 36 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/worker.py492 # Step 1: AI Change Intent — may suppress notificationCOMMENT
LOWchangedetectionio/worker.py513 # Step 2: AI Change Summary — only compute it when a notificationCOMMENT
LOW⚡changedetectionio/__init__.py465 # Step 3: Queue watches for recheck (if -r was provided)COMMENT
LOW⚡changedetectionio/__init__.py504 # Step 4: Setup batch mode monitor (if -b was provided)COMMENT
LOWchangedetectionio/__init__.py428 # Step 1: Add URLs with their options (if provided via -u flags)COMMENT
LOWchangedetectionio/__init__.py448 # Step 2: Queue newly added watches (if -u was provided in batch mode)COMMENT
LOW⚡changedetectionio/tests/test_extract_regex.py477 # Step 1: keep lines containing "price" (excludes Stock count and Shipping cost)COMMENT
LOW⚡changedetectionio/tests/test_extract_regex.py479 # Step 2: from those lines extract only dollar amountsCOMMENT
LOW⚡changedetectionio/tests/test_i18n.py91 # Step 1: Set the language to Italian using the /set-language endpointCOMMENT
LOW⚡changedetectionio/tests/test_i18n.py99 # Step 2: Request the index page - should be in ItalianCOMMENT
LOW⚡changedetectionio/tests/test_i18n.py629 # Step 2: User explicitly selects Korean languageCOMMENT
LOW⚡changedetectionio/tests/test_i18n.py638 # Step 3: Make another request with same zh-TW headerCOMMENT
LOWchangedetectionio/tests/test_i18n.py118 # Step 3: Switch back to EnglishCOMMENT
LOWchangedetectionio/tests/test_i18n.py611 # Step 1: Clear session and make first request with zh-TW header (auto-detect)COMMENT
LOW⚡changedetectionio/processors/restock_diff/processor.py246 # Step 2: Fall back to extruct (uses lxml, needs subprocess on Linux)COMMENT
LOWchangedetectionio/processors/restock_diff/processor.py225 # Step 1: Try pure Python extraction first (fast, no lxml, no memory leak)COMMENT
LOWchangedetectionio/model/__init__.py170 # IMPORTANT: Don't initialize __watch_was_edited yet!COMMENT
LOW⚡changedetectionio/blueprint/ui/diff.py60 # Step 1: Escape everything like Jinja2 would (this makes it XSS-safe)COMMENT
LOW⚡changedetectionio/blueprint/ui/diff.py63 # Step 2: Unescape only our exact diff spans generated by apply_html_color_to_body()COMMENT
Verbosity Indicators18 hits · 35 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/worker.py492 # Step 1: AI Change Intent — may suppress notificationCOMMENT
LOWchangedetectionio/worker.py513 # Step 2: AI Change Summary — only compute it when a notificationCOMMENT
LOW⚡changedetectionio/__init__.py465 # Step 3: Queue watches for recheck (if -r was provided)COMMENT
LOW⚡changedetectionio/__init__.py504 # Step 4: Setup batch mode monitor (if -b was provided)COMMENT
LOWchangedetectionio/__init__.py428 # Step 1: Add URLs with their options (if provided via -u flags)COMMENT
LOWchangedetectionio/__init__.py448 # Step 2: Queue newly added watches (if -u was provided in batch mode)COMMENT
LOW⚡changedetectionio/tests/test_extract_regex.py477 # Step 1: keep lines containing "price" (excludes Stock count and Shipping cost)COMMENT
LOW⚡changedetectionio/tests/test_extract_regex.py479 # Step 2: from those lines extract only dollar amountsCOMMENT
LOW⚡changedetectionio/tests/test_i18n.py91 # Step 1: Set the language to Italian using the /set-language endpointCOMMENT
LOW⚡changedetectionio/tests/test_i18n.py99 # Step 2: Request the index page - should be in ItalianCOMMENT
LOW⚡changedetectionio/tests/test_i18n.py629 # Step 2: User explicitly selects Korean languageCOMMENT
LOW⚡changedetectionio/tests/test_i18n.py638 # Step 3: Make another request with same zh-TW headerCOMMENT
LOWchangedetectionio/tests/test_i18n.py118 # Step 3: Switch back to EnglishCOMMENT
LOWchangedetectionio/tests/test_i18n.py611 # Step 1: Clear session and make first request with zh-TW header (auto-detect)COMMENT
LOW⚡changedetectionio/processors/restock_diff/processor.py246 # Step 2: Fall back to extruct (uses lxml, needs subprocess on Linux)COMMENT
LOWchangedetectionio/processors/restock_diff/processor.py225 # Step 1: Try pure Python extraction first (fast, no lxml, no memory leak)COMMENT
LOW⚡changedetectionio/blueprint/ui/diff.py60 # Step 1: Escape everything like Jinja2 would (this makes it XSS-safe)COMMENT
LOW⚡changedetectionio/blueprint/ui/diff.py63 # Step 2: Unescape only our exact diff spans generated by apply_html_color_to_body()COMMENT
Hallucination Indicators3 hits · 30 pts
SeverityFileLineSnippetContext
CRITICALchangedetectionio/static/js/jquery-3.6.0.min.js2!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):fCODE
CRITICALchangedetectionio/blueprint/settings/__init__.py70 form.application.form.notification_format.choices.pop()CODE
CRITICALchangedetectionio/blueprint/settings/__init__.py78 form.requests.form.proxy.choices.append(tuple((p, datastore.proxy_list[p]['label'])))CODE
AI Structural Patterns22 hits · 20 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/forms.py273CODE
LOWchangedetectionio/content_fetchers/playwright.py250CODE
LOWchangedetectionio/content_fetchers/puppeteer.py674CODE
LOWchangedetectionio/content_fetchers/requests.py210CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py63CODE
LOWchangedetectionio/content_fetchers/base.py165CODE
LOWchangedetectionio/tests/conftest.py322CODE
LOWchangedetectionio/tests/util.py421CODE
LOWchangedetectionio/diff/__init__.py309CODE
LOWchangedetectionio/diff/__init__.py424CODE
LOWchangedetectionio/processors/extract.py69CODE
LOW…ngedetectionio/processors/text_json_diff/difference.py247CODE
LOWchangedetectionio/model/Watch.py792CODE
LOWchangedetectionio/model/Watch.py1362CODE
LOWchangedetectionio/blueprint/ui/preview.py126CODE
LOWchangedetectionio/blueprint/ui/__init__.py227CODE
LOWchangedetectionio/blueprint/settings/__init__.py289CODE
LOWchangedetectionio/blueprint/settings/__init__.py306CODE
LOWchangedetectionio/blueprint/imports/__init__.py84CODE
LOWchangedetectionio/blueprint/tags/__init__.py40CODE
LOWchangedetectionio/blueprint/tags/__init__.py239CODE
LOWchangedetectionio/blueprint/backups/__init__.py177CODE
AI Slop Vocabulary11 hits · 20 pts
SeverityFileLineSnippetContext
MEDIUM⚡changedetectionio/worker_pool.py361 """Bulletproof queue operation with comprehensive error handling"""STRING
LOWchangedetectionio/html_tools.py617 # Foreach <script json></script> blob.. just return the first that matches json_filterCOMMENT
LOWchangedetectionio/flask_app.py386 # by a shared cache under the long-lived header static_content() just set.COMMENT
LOWchangedetectionio/content_fetchers/__init__.py170 # What it referenced doesn't exist, just use a defaultCOMMENT
LOWchangedetectionio/content_fetchers/requests.py197 # Binary files just return their checksum until we add something smarterCOMMENT
LOWchangedetectionio/notification/__init__.py8# But to avoid importing the whole heavy module just use the same strings here.COMMENT
LOWchangedetectionio/tests/test_request.py9# Hard to just add more live server URLs when one test is already running (I think)COMMENT
MEDIUMchangedetectionio/tests/test_history_consistency.py49 # Essentially just triggers the DB write/updateCOMMENT
LOWchangedetectionio/tests/test_notification.py23# Hard to just add more live server URLs when one test is already running (I think)COMMENT
MEDIUMchangedetectionio/processors/magic.py64 # Remove whitespace between < and tag name for robust detection (handles '< html', '<\nhtml', etc.)COMMENT
LOWchangedetectionio/conditions/blueprint.py35 # We'll ignore the returned response and just use the datastore which is modified by the functionCOMMENT
Modern AI Meta-Vocabulary4 hits · 14 pts
SeverityFileLineSnippetContext
MEDIUM⚡changedetectionio/forms.py1306 # DeepSeek-R1, Gemma 3, etc.) which emit chain-of-thought intoCOMMENT
MEDIUMchangedetectionio/llm/evaluator.py168# Models that emit chain-of-thought before the answer, on any provider. Reasoning tokens areCOMMENT
MEDIUM…edetectionio/tests/test_settings_notifications_page.py55 # The page uses the same tab UI scaffolding as /settings so the page stylesCOMMENT
MEDIUMchangedetectionio/blueprint/settings/llm.py191 # headroom needed for chain-of-thought to complete.COMMENT
Modern Structural Boilerplate6 hits · 6 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/diff/__init__.py511__all__ = [CODE
LOWchangedetectionio/diff/tokenizers/__init__.py19__all__ = [CODE
LOWchangedetectionio/jinja2_custom/__init__.py15__all__ = [CODE
LOWchangedetectionio/jinja2_custom/plugins/__init__.py7__all__ = ['regex_replace', 'unixtime']CODE
LOWchangedetectionio/model/__init__.py7__all__ = ['EntityPersistenceMixin', 'watch_base']CODE
LOWchangedetectionio/widgets/__init__.py3__all__ = ['TernaryNoneBooleanWidget', 'TernaryNoneBooleanField']CODE
Slop Phrases1 hit · 2 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/content_fetchers/__init__.py48 # In this case, make sure to edit the default one in store.py and fetch_site_status.pyCOMMENT