Repository Analysis

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!

34.2 Strong AI signal View on GitHub
34.2
Adjusted Score
34.2
Raw Score
100%
Time Factor
2026-05-29
Last Push
31,766
Stars
Python
Language
91,170
Lines of Code
434
Files
2045
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 3HIGH 121MEDIUM 264LOW 1657

Pattern Findings

2045 matches across 16 categories. Click a row to expand file-level details.

Hyper-Verbose Identifiers796 hits · 757 pts
SeverityFileLineSnippet
LOWchangedetectionio/pluggy_interface.py280def inject_datastore_into_plugins(datastore):
LOWchangedetectionio/pluggy_interface.py296def register_builtin_fetchers():
LOWchangedetectionio/pluggy_interface.py64 def get_itemprop_availability_override(self, content, fetcher_name, fetcher_instance, url, llm_intent=None):
LOWchangedetectionio/pluggy_interface.py244def load_plugins_from_directories():
LOWchangedetectionio/pluggy_interface.py318def register_builtin_restock_plugins():
LOWchangedetectionio/pluggy_interface.py336def collect_ui_edit_stats_extras(watch):
LOWchangedetectionio/pluggy_interface.py351def collect_fetcher_status_icons(fetcher_name):
LOWchangedetectionio/pluggy_interface.py371def get_itemprop_availability_from_plugin(content, fetcher_name, fetcher_instance, url, llm_intent=None):
LOWchangedetectionio/pluggy_interface.py576def get_plugin_template_paths():
LOWchangedetectionio/pluggy_interface.py632def apply_update_handler_alter(update_handler, watch, datastore):
LOWchangedetectionio/worker.py771async def send_content_changed_notification(watch_uuid, notification_q, datastore):
LOWchangedetectionio/worker.py784async def send_filter_failure_notification(watch_uuid, notification_q, datastore):
LOWchangedetectionio/worker.py797async def send_step_failure_notification(watch_uuid, step_n, notification_q, datastore):
LOWchangedetectionio/worker.py31def set_watch_minitext_status(watch, status):
LOWchangedetectionio/rss_tools.py9def cdata_in_document_to_text(html_content: str, render_anchor_tag_content=False) -> str:
LOWchangedetectionio/worker_pool.py129async def start_single_async_worker(worker_id, update_q, notification_q, app, datastore, executor=None):
LOWchangedetectionio/worker_pool.py218def claim_uuid_for_processing(uuid, worker_id):
LOWchangedetectionio/worker_pool.py243def release_uuid_from_processing(uuid, worker_id):
LOWchangedetectionio/worker_pool.py281def is_watch_running_by_another_worker(watch_uuid, current_worker_id):
LOWchangedetectionio/worker_pool.py377def adjust_async_worker_count(new_count, update_q=None, notification_q=None, app=None, datastore=None):
LOWchangedetectionio/queue_handlers.py540 def _emit_notification_signal(self, item: Dict[str, Any]):
LOWchangedetectionio/notification_service.py240 def set_random_for_validation(self):
LOWchangedetectionio/notification_service.py258def add_rendered_diff_to_notification_vars(notification_scan_text:str, prev_snapshot:str, current_snapshot:str, word_dif
LOWchangedetectionio/notification_service.py323def set_basic_notification_vars(current_snapshot, prev_snapshot, watch, triggered_text, timestamp_changed=None):
LOWchangedetectionio/notification_service.py354 def queue_notification_for_watch(self, n_object: NotificationContextData, watch, date_index_from=-2, date_index_to=-
LOWchangedetectionio/notification_service.py411 def send_content_changed_notification(self, watch_uuid):
LOWchangedetectionio/notification_service.py455 def send_filter_failure_notification(self, watch_uuid):
LOWchangedetectionio/notification_service.py502 def send_step_failure_notification(self, watch_uuid, step_n):
LOWchangedetectionio/notification_service.py550def create_notification_service(datastore, notification_q):
LOWchangedetectionio/validate_url.py112def is_url_private_or_parser_confused(url):
LOWchangedetectionio/__init__.py516 def queue_watches_for_recheck(datastore, iteration):
LOWchangedetectionio/forms.py223def validate_time_between_check_has_values(form):
LOWchangedetectionio/forms.py802# def validate_notification_urls(self, field):
LOWchangedetectionio/html_tools.py122def perl_style_slash_enclosed_regex_to_options(regex):
LOWchangedetectionio/html_tools.py171def subtractive_xpath_selector(selectors: List[str], html_content: str) -> str:
LOWchangedetectionio/html_tools.py440def _get_stripped_text_from_json_match(match):
LOWchangedetectionio/html_tools.py461def extract_json_blob_from_html(content, ensure_is_ldjson_info_type, json_filter):
LOWchangedetectionio/html_tools.py638def cdata_in_document_to_text(html_content: str, render_anchor_tag_content=False) -> str:
LOWchangedetectionio/html_tools.py728def workarounds_for_obfuscations(content):
LOWchangedetectionio/auth_decorator.py16def login_optionally_required(func):
LOWchangedetectionio/flask_app.py139def _configure_plugin_templates():
LOWchangedetectionio/flask_app.py238def _get_watch_queue_position(watch_obj):
LOWchangedetectionio/flask_app.py244def _get_current_worker_count():
LOWchangedetectionio/flask_app.py526 def inject_llm_features_disabled():
LOWchangedetectionio/flask_app.py704 def before_request_handle_cookie_x_settings():
LOWchangedetectionio/flask_app.py1112def ticker_thread_check_time_launch_checks():
LOWchangedetectionio/llm/prompt_builder.py117def build_preview_system_prompt() -> str:
LOWchangedetectionio/llm/prompt_builder.py134def build_change_summary_prompt(diff: str, custom_prompt: str,
LOWchangedetectionio/llm/prompt_builder.py158def build_change_summary_system_prompt() -> str:
LOWchangedetectionio/llm/prompt_builder.py200def build_setup_system_prompt() -> str:
LOWchangedetectionio/llm/evaluator.py298def get_global_token_budget_month(datastore=None) -> int:
LOWchangedetectionio/llm/evaluator.py490def get_effective_summary_prompt(watch, datastore) -> str:
LOWchangedetectionio/llm/evaluator.py153def apply_local_token_multiplier(base_max_tokens: int, llm_cfg: dict) -> int:
LOWchangedetectionio/llm/evaluator.py378def is_global_token_budget_exceeded(datastore) -> bool:
LOWchangedetectionio/llm/evaluator.py502def compute_summary_cache_key(diff_text: str, prompt: str) -> str:
LOWchangedetectionio/llm/evaluator.py543def build_summary_cache_prompt(effective_prompt: str, max_summary_tokens: int,
LOWchangedetectionio/browser_steps/browser_steps.py11def browser_steps_get_valid_steps(browser_steps: list):
LOWchangedetectionio/browser_steps/browser_steps.py148 async def action_click_element_containing_text(self, selector=None, value=''):
LOWchangedetectionio/browser_steps/browser_steps.py158 async def action_click_element_containing_text_if_exists(self, selector=None, value=''):
LOWchangedetectionio/browser_steps/browser_steps.py170 async def action_enter_text_in_field(self, selector, value):
736 more matches not shown…
Decorative Section Separators184 hits · 698 pts
SeverityFileLineSnippet
MEDIUMchangedetectionio/__init__.py24# ==============================================================================
MEDIUMchangedetectionio/__init__.py26# ==============================================================================
MEDIUMchangedetectionio/__init__.py61# ==============================================================================
MEDIUMchangedetectionio/test_cli_opts.sh55# =============================================================================
MEDIUMchangedetectionio/test_cli_opts.sh57# =============================================================================
MEDIUMchangedetectionio/test_cli_opts.sh198# =============================================================================
MEDIUMchangedetectionio/test_cli_opts.sh200# =============================================================================
MEDIUMchangedetectionio/llm/evaluator.py289# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/llm/evaluator.py291# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/llm/evaluator.py486# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/llm/evaluator.py488# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/llm/evaluator.py647# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/llm/evaluator.py649# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/llm/evaluator.py703# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/llm/evaluator.py705# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/llm/evaluator.py187# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/llm/evaluator.py189# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/llm/evaluator.py230# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/llm/evaluator.py232# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/llm/evaluator.py396# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/llm/evaluator.py398# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py729 # ------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py732 # ------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py741 # ------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py744 # ------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py754 # ------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py758 # ------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py775 # ------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py778 # ------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py865 # ---------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py867 # ---------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py874 # ---------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py876 # ---------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py888 # ---------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py890 # ---------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py894 # ---------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py896 # ---------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py906 # ---------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py908 # ---------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py692 # ------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py694 # ------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py711 # ------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py714 # ------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py921 # ---------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_security.py924 # ---------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py74# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py76# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py144# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py146# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py210# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py212# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py244# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py246# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py299# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py301# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py348# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py350# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py23# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py25# ---------------------------------------------------------------------------
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py50# ---------------------------------------------------------------------------
124 more matches not shown…
Magic Placeholder Names87 hits · 360 pts
SeverityFileLineSnippet
HIGHdocs/api-spec.yaml1311 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml1315 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml1319 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml1324 headers = {'x-api-key': 'YOUR_API_KEY'}
HIGHdocs/api-spec.yaml2023 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml2029 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml2035 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml2043 'x-api-key': 'YOUR_API_KEY',
HIGHdocs/api-spec.yaml29 For example: `x-api-key: YOUR_API_KEY`
HIGHdocs/api-spec.yaml162 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml196 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml215 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml239 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml255 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml895 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml900 headers = {'x-api-key': 'YOUR_API_KEY'}
HIGHdocs/api-spec.yaml968 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml983 'x-api-key': 'YOUR_API_KEY',
HIGHdocs/api-spec.yaml1032 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml1037 headers = {'x-api-key': 'YOUR_API_KEY'}
HIGHdocs/api-spec.yaml1094 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml1106 'x-api-key': 'YOUR_API_KEY',
HIGHdocs/api-spec.yaml1152 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml1157 headers = {'x-api-key': 'YOUR_API_KEY'}
HIGHdocs/api-spec.yaml1190 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml1195 headers = {'x-api-key': 'YOUR_API_KEY'}
HIGHdocs/api-spec.yaml1232 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml1237 headers = {'x-api-key': 'YOUR_API_KEY'}
HIGHdocs/api-spec.yaml1515 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml1521 headers = {'x-api-key': 'YOUR_API_KEY'}
HIGHdocs/api-spec.yaml1555 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml1560 headers = {'x-api-key': 'YOUR_API_KEY'}
HIGHdocs/api-spec.yaml1594 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml1604 'x-api-key': 'YOUR_API_KEY',
HIGHdocs/api-spec.yaml1644 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml1649 headers = {'x-api-key': 'YOUR_API_KEY'}
HIGHdocs/api-spec.yaml1696 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml1707 'x-api-key': 'YOUR_API_KEY',
HIGHdocs/api-spec.yaml1747 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml1752 headers = {'x-api-key': 'YOUR_API_KEY'}
HIGHdocs/api-spec.yaml1779 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml1784 headers = {'x-api-key': 'YOUR_API_KEY'}
HIGHdocs/api-spec.yaml1804 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml1817 'x-api-key': 'YOUR_API_KEY',
HIGHdocs/api-spec.yaml1858 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml1870 'x-api-key': 'YOUR_API_KEY',
HIGHdocs/api-spec.yaml1906 -H "x-api-key: YOUR_API_KEY" \
HIGHdocs/api-spec.yaml1918 'x-api-key': 'YOUR_API_KEY',
HIGHdocs/api-spec.yaml1951 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml1956 headers = {'x-api-key': 'YOUR_API_KEY'}
HIGHdocs/api-spec.yaml2122 -H "x-api-key: YOUR_API_KEY"
HIGHdocs/api-spec.yaml2127 headers = {'x-api-key': 'YOUR_API_KEY'}
HIGHdocs/api_v1/index.html974 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>
HIGHdocs/api_v1/index.html978 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>
HIGHdocs/api_v1/index.html982 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>
HIGHdocs/api_v1/index.html471&lt;p&gt;For example: &lt;code&gt;x-api-key: YOUR_API_KEY&lt;/code&gt;&lt;/p&gt;
HIGHdocs/api_v1/index.html473<p>For example: <code>x-api-key: YOUR_API_KEY</code></p>
HIGHdocs/api_v1/index.html495 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>
HIGHdocs/api_v1/index.html659 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>
HIGHdocs/api_v1/index.html803 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>
27 more matches not shown…
Excessive Try-Catch Wrapping317 hits · 352 pts
SeverityFileLineSnippet
MEDIUMchangedetectionio/pluggy_interface.py271 print(f"Error loading plugin {module_name}: {e}")
LOWchangedetectionio/pluggy_interface.py332 except Exception as e:
LOWchangedetectionio/pluggy_interface.py547 except Exception as e:
LOWchangedetectionio/pluggy_interface.py571 except Exception as e:
LOWchangedetectionio/pluggy_interface.py688 except Exception as e:
LOWchangedetectionio/worker.py780 except Exception as e:
LOWchangedetectionio/worker.py793 except Exception as e:
LOWchangedetectionio/worker.py806 except Exception as e:
LOWchangedetectionio/worker.py120 except Exception as e:
LOWchangedetectionio/worker.py135 except Exception as health_e:
LOWchangedetectionio/worker.py403 except Exception as e:
LOWchangedetectionio/worker.py511 except Exception as e:
LOWchangedetectionio/worker.py567 except Exception as _fe:
LOWchangedetectionio/worker.py584 except Exception as e:
LOWchangedetectionio/worker.py602 except Exception as e:
LOWchangedetectionio/worker.py615 except Exception as e:
LOWchangedetectionio/worker.py642 except Exception as e:
LOWchangedetectionio/worker.py665 except Exception as e:
LOWchangedetectionio/worker.py689 except Exception as cleanup_error:
LOWchangedetectionio/worker.py702 except Exception as finalize_error:
LOWchangedetectionio/worker.py714 except Exception as release_error:
LOWchangedetectionio/is_safe_url.py110 except Exception as e:
LOWchangedetectionio/rss_tools.py201 except Exception as e:
LOWchangedetectionio/worker_pool.py78 except Exception as e:
LOWchangedetectionio/worker_pool.py124 except Exception as e:
LOWchangedetectionio/worker_pool.py157 except Exception as e:
LOWchangedetectionio/worker_pool.py188 except Exception as e:
LOWchangedetectionio/worker_pool.py298 except Exception as uuid_e:
LOWchangedetectionio/worker_pool.py322 except Exception as e:
LOWchangedetectionio/worker_pool.py330 except Exception as health_e:
LOWchangedetectionio/worker_pool.py336 except Exception:
LOWchangedetectionio/worker_pool.py367 except Exception as e:
LOWchangedetectionio/queue_handlers.py248 except Exception as e:
LOWchangedetectionio/queue_handlers.py257 except Exception as e:
LOWchangedetectionio/queue_handlers.py267 except Exception as e:
LOWchangedetectionio/queue_handlers.py537 except Exception as e:
LOWchangedetectionio/queue_handlers.py549 except Exception as e:
LOWchangedetectionio/queue_handlers.py60 except Exception as e:
LOWchangedetectionio/queue_handlers.py79 except Exception as notif_e:
LOWchangedetectionio/queue_handlers.py91 except Exception as signal_e:
LOWchangedetectionio/queue_handlers.py97 except Exception as e:
LOWchangedetectionio/queue_handlers.py121 except Exception as signal_e:
LOWchangedetectionio/queue_handlers.py131 except Exception as e:
LOWchangedetectionio/queue_handlers.py157 except Exception as e:
LOWchangedetectionio/queue_handlers.py200 except Exception as e:
LOWchangedetectionio/queue_handlers.py210 except Exception as e:
LOWchangedetectionio/queue_handlers.py223 except Exception as e:
LOWchangedetectionio/queue_handlers.py297 except Exception as e:
LOWchangedetectionio/queue_handlers.py332 except Exception as e:
LOWchangedetectionio/queue_handlers.py373 except Exception as e:
LOWchangedetectionio/queue_handlers.py384 except Exception:
LOWchangedetectionio/queue_handlers.py401 except Exception as e:
LOWchangedetectionio/queue_handlers.py409 except Exception as e:
LOWchangedetectionio/queue_handlers.py435 except Exception as e:
LOWchangedetectionio/queue_handlers.py457 except Exception as e:
LOWchangedetectionio/queue_handlers.py480 except Exception as e:
LOWchangedetectionio/queue_handlers.py495 except Exception as e:
LOWchangedetectionio/queue_handlers.py515 except Exception as e:
LOWchangedetectionio/queue_handlers.py524 except Exception as e:
LOWchangedetectionio/favicon_utils.py31 except Exception:
257 more matches not shown…
Unused Imports299 hits · 285 pts
SeverityFileLineSnippet
LOWchangedetectionio/worker.py328
LOWchangedetectionio/worker.py404
LOWchangedetectionio/worker.py451
LOWchangedetectionio/queue_handlers.py3
LOWchangedetectionio/gc_cleanup.py9
LOWchangedetectionio/validate_url.py3
LOWchangedetectionio/forms.py15
LOWchangedetectionio/forms.py508
LOWchangedetectionio/auth_decorator.py3
LOWchangedetectionio/auth_decorator.py4
LOWchangedetectionio/time_handler.py1
LOWchangedetectionio/languages.py5
LOWchangedetectionio/llm/evaluator.py34
LOW…angedetectionio/content_fetchers/screenshot_handler.py9
LOWchangedetectionio/content_fetchers/__init__.py4
LOWchangedetectionio/content_fetchers/__init__.py11
LOWchangedetectionio/content_fetchers/__init__.py30
LOWchangedetectionio/content_fetchers/__init__.py105
LOWchangedetectionio/content_fetchers/__init__.py98
LOWchangedetectionio/content_fetchers/__init__.py101
LOWchangedetectionio/content_fetchers/puppeteer.py10
LOWchangedetectionio/content_fetchers/requests.py3
LOWchangedetectionio/content_fetchers/requests.py12
LOWchangedetectionio/content_fetchers/requests.py40
LOWchangedetectionio/content_fetchers/requests.py40
LOWchangedetectionio/content_fetchers/requests.py40
LOW…angedetectionio/content_fetchers/webdriver_selenium.py4
LOW…angedetectionio/content_fetchers/webdriver_selenium.py33
LOW…angedetectionio/content_fetchers/webdriver_selenium.py34
LOWchangedetectionio/notification/handler.py309
LOWchangedetectionio/notification/handler.py311
LOW…angedetectionio/notification/apprise_plugin/discord.py61
LOW…angedetectionio/notification/apprise_plugin/discord.py61
LOW…ctionio/notification/apprise_plugin/custom_handlers.py53
LOW…ctionio/notification/apprise_plugin/custom_handlers.py63
LOWchangedetectionio/tests/test_rss_reader_mode.py3
LOWchangedetectionio/tests/test_rss_reader_mode.py7
LOWchangedetectionio/tests/test_rss_reader_mode.py7
LOWchangedetectionio/tests/test_rss_reader_mode.py7
LOWchangedetectionio/tests/test_rss_reader_mode.py7
LOWchangedetectionio/tests/test_rss_reader_mode.py7
LOWchangedetectionio/tests/test_queue_handler.py4
LOWchangedetectionio/tests/test_queue_handler.py4
LOWchangedetectionio/tests/test_queue_handler.py5
LOWchangedetectionio/tests/test_preview_endpoints.py3
LOWchangedetectionio/tests/test_preview_endpoints.py5
LOWchangedetectionio/tests/test_preview_endpoints.py5
LOWchangedetectionio/tests/test_preview_endpoints.py5
LOWchangedetectionio/tests/test_backend.py6
LOWchangedetectionio/tests/test_backend.py6
LOWchangedetectionio/tests/test_api_openapi.py9
LOWchangedetectionio/tests/test_api_openapi.py12
LOWchangedetectionio/tests/test_api_openapi.py12
LOWchangedetectionio/tests/test_access_control.py1
LOWchangedetectionio/tests/test_access_control.py3
LOWchangedetectionio/tests/test_ignore_regex_text.py3
LOWchangedetectionio/tests/test_security.py3
LOWchangedetectionio/tests/test_security.py11
LOWchangedetectionio/tests/test_security.py390
LOWchangedetectionio/tests/test_ignore.py3
239 more matches not shown…
Self-Referential Comments53 hits · 143 pts
SeverityFileLineSnippet
MEDIUM.github/workflows/test-stack-reusable-workflow.yml416 # Create a watch via API through nginx proxy subpath
MEDIUM.github/workflows/test-stack-reusable-workflow.yml741 # Create a watch with tag "github-group-test" via API
MEDIUM.github/workflows/test-stack-reusable-workflow.yml755 # Create a specific test URL watch
MEDIUMchangedetectionio/is_safe_url.py93 # Create a URL adapter bound to the server name
MEDIUMchangedetectionio/worker_pool.py52 # Create a new event loop for this thread
MEDIUMchangedetectionio/gc_cleanup.py53 # Create a new thread local object to encourage cleanup of old ones
MEDIUMchangedetectionio/__init__.py309 # Create the datadir if it doesnt exist
MEDIUMchangedetectionio/test_cli_opts.sh148 # Create a watch using CLI, then recheck it
MEDIUMchangedetectionio/flask_app.py148 # Create a ChoiceLoader that searches app templates first, then plugin templates
MEDIUMchangedetectionio/notification/handler.py110 # Define the mapping between your placeholders and markdown markers
MEDIUMchangedetectionio/notification/handler.py134 # Define the mapping between your placeholders and markdown markers
MEDIUMchangedetectionio/tests/test_security.py960 # Create a real watch and trigger a check so we have a valid backup structure
MEDIUMchangedetectionio/tests/test_rss_group.py47 # Create a tag/group
MEDIUMchangedetectionio/tests/test_rss_group.py160 # Create a tag with no watches
MEDIUMchangedetectionio/tests/test_rss_group.py197 # Create a tag
MEDIUMchangedetectionio/tests/test_api_security.py50 # Create a valid watch first
MEDIUMchangedetectionio/tests/test_api_security.py333 # Create a watch
MEDIUMchangedetectionio/tests/test_basic_socketio.py24 # Create a test client for SocketIO
MEDIUMchangedetectionio/tests/test_commit_persistence.py28 # Create a watch
MEDIUMchangedetectionio/tests/test_commit_persistence.py519 # Create a tag
MEDIUM…ctionio/tests/test_api_notification_urls_validation.py128 # Create a tag
MEDIUMchangedetectionio/tests/test_backup.py138 # Create a full backup
MEDIUMchangedetectionio/tests/test_llm_api_key_security.py618 # Create a real watch — required to exercise llm_clear_summary_cache's
MEDIUMchangedetectionio/tests/test_llm_token_budget.py67 # Create a watch via API
MEDIUMchangedetectionio/tests/test_tag_url_match.py22 # Create a tag with a URL match pattern
MEDIUMchangedetectionio/tests/test_api.py65 # Create a watch
MEDIUMchangedetectionio/tests/test_api.py557 # Create a watch
MEDIUMchangedetectionio/tests/test_api.py936 # Create a watch in restock_diff mode WITH processor_config in the POST body (matches the API docs example)
MEDIUMchangedetectionio/tests/test_api.py1120 # Create a watch
MEDIUM…detectionio/tests/test_settings_tag_force_reprocess.py99 # Create a tag
MEDIUM…detectionio/tests/test_settings_tag_force_reprocess.py169 # Create a tag
MEDIUMchangedetectionio/tests/test_jinja2.py250 # Create a large input string (over 10MB)
MEDIUMchangedetectionio/tests/test_jinja2.py286 # Create a template with the dangerous pattern
MEDIUMchangedetectionio/tests/test_api_tags.py100 # Create a watch with the tag and check it matches UUID
MEDIUMchangedetectionio/tests/test_api_tags.py188 # Create a tag with processor_config_restock_diff in a single POST (issue #3966)
MEDIUMchangedetectionio/tests/test_llm_change_summary.py78 # Create a tag with llm_change_summary
MEDIUMchangedetectionio/tests/unit/test_watch_model.py224 # Create a watch with large datastore (many watches)
MEDIUMchangedetectionio/tests/unit/test_conditions.py14 # Create a temporary directory for the test datastore
MEDIUMchangedetectionio/realtime/socket_server.py158 # Create a simplified watch data object to send to clients
MEDIUMchangedetectionio/realtime/socket_server.py345 # Create a dedicated signal handler that will receive signals and emit them to clients
MEDIUMchangedetectionio/processors/__init__.py457 # Create a processor instance to access config methods
MEDIUMchangedetectionio/processors/base.py33 # Create a stable snapshot of the watch for processing
MEDIUMchangedetectionio/conditions/blueprint.py43 # Create a temporary watch data structure with this single rule
MEDIUMchangedetectionio/conditions/blueprint.py54 # Create a temporary application data structure for the rule check
MEDIUMchangedetectionio/conditions/__init__.py29# Define the extended operations dictionary
MEDIUMchangedetectionio/conditions/__init__.py131 # Create the ruleset
MEDIUMchangedetectionio/model/__init__.py440 # Create a cached version if it doesn't exist
MEDIUMchangedetectionio/model/Watch.py943 # Create a smaller intermediate image (to reduce memory usage)
MEDIUMchangedetectionio/api/Watch.py73 # Create a dict copy for JSON response (with lock for thread safety)
MEDIUMchangedetectionio/blueprint/ui/edit.py135 # Create a processor instance to access config methods
MEDIUMchangedetectionio/blueprint/browser_steps/__init__.py408 # Create the response with ETag
MEDIUMchangedetectionio/blueprint/backups/__init__.py61 # Create a list file with just the URLs, so it's easier to port somewhere else in the future
MEDIUMchangedetectionio/store/__init__.py54 # Initialize parent class
Deep Nesting139 hits · 126 pts
SeverityFileLineSnippet
LOWchangedetectionio/pluggy_interface.py244
LOWchangedetectionio/pluggy_interface.py371
LOWchangedetectionio/pluggy_interface.py576
LOWchangedetectionio/worker.py46
LOWchangedetectionio/worker_pool.py129
LOWchangedetectionio/worker_pool.py449
LOWchangedetectionio/queue_handlers.py227
LOWchangedetectionio/queue_handlers.py271
LOWchangedetectionio/queue_handlers.py301
LOWchangedetectionio/queue_handlers.py336
LOWchangedetectionio/gc_cleanup.py12
LOWchangedetectionio/__init__.py181
LOWchangedetectionio/forms.py124
LOWchangedetectionio/html_tools.py226
LOWchangedetectionio/html_tools.py268
LOWchangedetectionio/html_tools.py461
LOWchangedetectionio/html_tools.py571
LOWchangedetectionio/html_tools.py759
LOWchangedetectionio/auth_decorator.py16
LOWchangedetectionio/auth_decorator.py23
LOWchangedetectionio/custom_queue.py91
LOWchangedetectionio/custom_queue.py155
LOWchangedetectionio/custom_queue.py249
LOWchangedetectionio/custom_queue.py414
LOWchangedetectionio/custom_queue.py496
LOWchangedetectionio/languages.py78
LOWchangedetectionio/flask_app.py464
LOWchangedetectionio/flask_app.py1058
LOWchangedetectionio/flask_app.py1112
LOWchangedetectionio/flask_app.py532
LOWchangedetectionio/flask_app.py746
LOWchangedetectionio/flask_app.py947
LOWchangedetectionio/llm/client.py57
LOWchangedetectionio/content_fetchers/__init__.py39
LOWchangedetectionio/content_fetchers/requests.py24
LOW…angedetectionio/content_fetchers/webdriver_selenium.py63
LOW…angedetectionio/content_fetchers/webdriver_selenium.py81
LOWchangedetectionio/content_fetchers/base.py165
LOWchangedetectionio/notification/handler.py153
LOWchangedetectionio/notification/handler.py209
LOWchangedetectionio/notification/handler.py307
LOW…angedetectionio/notification/apprise_plugin/discord.py56
LOW…angedetectionio/notification/apprise_plugin/discord.py200
LOWchangedetectionio/tests/conftest.py43
LOWchangedetectionio/tests/conftest.py404
LOWchangedetectionio/tests/conftest.py439
LOWchangedetectionio/tests/util.py245
LOWchangedetectionio/tests/util.py257
LOWchangedetectionio/tests/test_history_consistency.py13
LOWchangedetectionio/tests/test_basic_socketio.py13
LOW…ngedetectionio/tests/unit/test_auth_decorator_order.py43
LOWchangedetectionio/tests/smtp/smtp-test-server.py17
LOWchangedetectionio/diff/__init__.py79
LOWchangedetectionio/diff/__init__.py309
LOWchangedetectionio/diff/tokenizers/words_and_html.py13
LOWchangedetectionio/realtime/events.py6
LOWchangedetectionio/realtime/events.py10
LOWchangedetectionio/realtime/socket_server.py62
LOWchangedetectionio/processors/magic.py59
LOWchangedetectionio/processors/__init__.py21
79 more matches not shown…
Redundant / Tautological Comments72 hits · 116 pts
SeverityFileLineSnippet
LOW.github/workflows/test-stack-reusable-workflow.yml143 # Check if RSS is less than 100MB
LOWchangedetectionio/pluggy_interface.py289 # Check if plugin has datastore attribute and it's not set
LOWchangedetectionio/pluggy_interface.py399 # Check if the result has any meaningful data
LOWchangedetectionio/pluggy_interface.py609 # Check if plugin has a templates directory
LOWchangedetectionio/worker.py738 # Check if we should restart (only when idle, between jobs)
LOWchangedetectionio/worker.py747 # Check if we should exit
LOWchangedetectionio/worker.py751 # Check if we're in pytest environment - if so, be more gentle with logging
LOWchangedetectionio/worker_pool.py133 # Check if we're in pytest environment - if so, be more gentle with logging
LOWchangedetectionio/worker_pool.py346 # Check if we're in pytest environment - if so, be more gentle with logging
LOWchangedetectionio/queue_handlers.py447 # Check if all notifications are muted
LOWchangedetectionio/queue_handlers.py471 # Check if all notifications are muted
LOWchangedetectionio/gc_cleanup.py68 # Check if lxml.etree is in use
LOWchangedetectionio/gc_cleanup.py95 # Check if lxml.html is in use
LOWchangedetectionio/gc_cleanup.py117 # Check if json module is being used and try to clear its cache
LOWchangedetectionio/__init__.py575 # Check if we need to repeat
LOWchangedetectionio/html_tools.py179 # Iterate over the list of XPath selectors
LOWchangedetectionio/time_handler.py55 # Check if the current day matches the target day or overlaps due to duration
LOWchangedetectionio/languages.py91 # Check if messages.po exists
LOWchangedetectionio/flask_app.py370 # Check if it's a built-in fetcher
LOWchangedetectionio/flask_app.py623 # Check if there's a redirect parameter to return to after re-login
LOWchangedetectionio/flask_app.py656 # Check if there's a redirect parameter to return to the same page
LOWchangedetectionio/flask_app.py839 # Check if file exists in plugin's static directory
LOWchangedetectionio/flask_app.py1145 # Check if all checks are paused
LOWchangedetectionio/browser_steps/browser_steps.py90 # Check if action handler exists
LOWchangedetectionio/browser_steps/browser_steps.py112 # Check if navigation actually occurred
LOWchangedetectionio/browser_steps/browser_steps.py433 # Check if session has expired based on age
LOWchangedetectionio/content_fetchers/playwright.py57 # Set viewport to a larger size to capture more content at once
LOWchangedetectionio/content_fetchers/puppeteer.py383 # Check if page still exists (might have been closed due to error during sleep)
LOWchangedetectionio/content_fetchers/puppeteer.py413 # Check if page still exists before sending command
LOW…angedetectionio/notification/apprise_plugin/discord.py43 # Check if body contains our diff placeholders
LOW…angedetectionio/notification/apprise_plugin/discord.py116 # Check if we're approaching the embed count limit
LOW…angedetectionio/notification/apprise_plugin/discord.py127 # Check if adding this embed would exceed total character limit
LOWchangedetectionio/tests/test_commit_persistence.py437 # Set browser_steps to meaningless values
LOWchangedetectionio/tests/test_i18n.py169 # Set language to Italian
LOWchangedetectionio/tests/test_i18n.py651 # Set language to German
LOWchangedetectionio/tests/unit/test_time_handler.py94 # Set schedule to start 23:30 with 120 minute duration (crosses midnight)
LOWchangedetectionio/tests/unit/test_time_handler.py177 # Set time to current hour
LOWchangedetectionio/tests/unit/test_time_handler.py513 # Set time to 3 hours ago
LOWchangedetectionio/diff/__init__.py135 # Check if there are any changes
LOWchangedetectionio/diff/__init__.py141 # Check if the whole line is replaced (no unchanged content)
LOWchangedetectionio/diff/__init__.py270 # Check if there are any changes
LOWchangedetectionio/diff/__init__.py406 # Check if there are any actual changes (not just whitespace when ignore_junk is enabled)
LOWchangedetectionio/realtime/events.py22 # Check if watch exists
LOWchangedetectionio/realtime/socket_server.py319 # Check if authentication is required and user is not authenticated
LOWchangedetectionio/processors/__init__.py204 # Check if DISABLED_PROCESSORS env var is set
LOWchangedetectionio/processors/__init__.py221 # Check if this is a plugin processor
LOW…ngedetectionio/processors/image_ssim_diff/processor.py62 # Check if bounding box is set (for drawn area mode)
LOW…ngedetectionio/processors/image_ssim_diff/processor.py146 # Check if this is the first check (no previous history)
LOW…ngedetectionio/processors/image_ssim_diff/edit_hook.py38 # Check if template matching is globally enabled via ENV var
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py45 # Check if decoding succeeded
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py150 # Check if result is an error dict
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py306 # Check if result is an error dict
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py436 # Check if result is an error dict
LOW…ssors/image_ssim_diff/image_handler/isolated_opencv.py581 # Check if result is an error dict
LOW…ssors/image_ssim_diff/image_handler/libvips_handler.py285 # Check if match is good enough (80% confidence threshold)
LOW…ngedetectionio/processors/text_json_diff/difference.py168 # Check if this is a user submission (any diff pref param exists in query string)
LOW…angedetectionio/processors/text_json_diff/processor.py184 # Check if it's perl-style regex /.../
LOW…ionio/processors/restock_diff/pure_python_extractor.py37 # Check if this is a JSON-LD script tag
LOWchangedetectionio/model/__init__.py310 # Check if we're being initialized from an existing watch object
LOWchangedetectionio/model/__init__.py452 # Check if it's a property descriptor
12 more matches not shown…
Cross-Language Confusion14 hits · 71 pts
SeverityFileLineSnippet
HIGHchangedetectionio/forms.py563 f"The following tokens used in the notification are not valid: {undefined}"
HIGHchangedetectionio/notification/handler.py475#@todo on null:// (only if its a 1 url with null) probably doesnt need to actually .add/setup/etc
HIGHchangedetectionio/tests/test_api_security.py499 # Should accept (empty is valid as null)
HIGHchangedetectionio/tests/test_api.py1153 - CREATE endpoint rejects null, empty, and invalid URLs
HIGHchangedetectionio/tests/test_api.py1154 - UPDATE endpoint rejects attempts to change URL to null, empty, or invalid
HIGHchangedetectionio/tests/test_xpath_selector_unit.py142 ("manager[1]/@name || manager[2]/@name", "GodotFreya"),
HIGHchangedetectionio/tests/test_llm_change_summary.py158 return JSON {"summary": null, "error": "<readable message>"} with a 500
HIGHchangedetectionio/tests/llm/test_response_parser.py93 raw = '{"needs_prefilter": false, "selector": null, "reason": "intent is global"}'
HIGHchangedetectionio/tests/llm/test_llm_restock_plugin.py128 llm_json = '{"price": null, "currency": null, "availability": "instock"}'
HIGHchangedetectionio/tests/llm/test_llm_restock_plugin.py138 llm_json = '{"price": 19.95, "currency": "GBP", "availability": null}'
HIGHchangedetectionio/tests/llm/test_llm_restock_plugin.py148 llm_json = '{"price": null, "currency": null, "availability": null}'
HIGHchangedetectionio/tests/llm/test_llm_restock_plugin.py200 llm_json = '{"price": null, "currency": null, "availability": null}'
HIGHchangedetectionio/api/Import.py39 - anyOf: [{type: string}, {type: null}] (anyOf format)
HIGHchangedetectionio/blueprint/ui/diff.py180 Returns JSON: {"summary": "...", "error": null} or {"summary": null, "error": "..."}
Cross-File Repetition13 hits · 65 pts
SeverityFileLineSnippet
HIGH…ngedetectionio/tests/test_trigger_regex_with_filter.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> </body> <
HIGHchangedetectionio/tests/test_ignorestatuscode.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> </body> <
HIGH…angedetectionio/tests/test_block_while_text_present.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> </body> <
HIGHchangedetectionio/tests/test_conditions.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> </body> <
HIGHchangedetectionio/tests/test_conditions.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> </body> <
HIGHchangedetectionio/tests/test_ignorewhitespace.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> </body> <
HIGHchangedetectionio/tests/test_trigger_regex.py0<html> <body> some initial text<br> <p>which is across multiple lines</p> <br> so let's see what happens. <br> </body> <
HIGHchangedetectionio/tests/test_conditions.py0<html> <body> <h1>test page for conditions</h1> <p>this page contains a number that will be tested with conditions.</p>
HIGHchangedetectionio/tests/test_conditions.py0<html> <body> <h1>test page for conditions</h1> <p>this page contains a number that will be tested with conditions.</p>
HIGHchangedetectionio/tests/test_conditions.py0<html> <body> <h1>test page for conditions</h1> <p>this page contains a number that will be tested with conditions.</p>
HIGHchangedetectionio/tests/smtp/test_notification_smtp.py0when following a plaintext document, notification in plain text format is sent correctly
HIGHchangedetectionio/tests/smtp/test_notification_smtp.py0when following a plaintext document, notification in plain text format is sent correctly
HIGHchangedetectionio/tests/smtp/test_notification_smtp.py0when following a plaintext document, notification in plain text format is sent correctly
Docstring Block Structure7 hits · 35 pts
SeverityFileLineSnippet
HIGHchangedetectionio/is_safe_url.py22 Validate that a redirect URL is safe to prevent open redirect vulnerabilities. This follows Flask/Werkzeug bes
HIGHchangedetectionio/queue_handlers.py162 Efficient async get using executor for blocking call. HYBRID APPROACH: Best of both worlds - U
HIGHchangedetectionio/diff/tokenizers/natural_text.py12 Split text into words using simple whitespace boundaries. This is a simpler tokenizer that treats all whitespa
HIGHchangedetectionio/diff/tokenizers/words_and_html.py14 Split text into words and boundaries (spaces, HTML tags). This tokenizer preserves HTML tags as atomic units w
HIGHchangedetectionio/processors/restock_diff/processor.py204 Extract itemprop availability with hybrid approach for memory efficiency. Strategy (fastest to slowest, least
HIGHchangedetectionio/model/persistence.py13 Determine entity type from class hierarchy (cached at class level). Args: cls: The class to inspect
HIGHchangedetectionio/model/Watch.py55 Save compressed data using native brotli with streaming compression. Uses chunked compression to minimize peak
Over-Commented Block33 hits · 30 pts
SeverityFileLineSnippet
LOWrequirements.txt61beautifulsoup4>=4.0.0,<=4.14.3
LOWdocker-entrypoint.sh1#!/bin/bash
LOWdocker-compose.yml1services:
LOWdocker-compose.yml21 # Example: Install the OSINT reconnaissance processor plugin
LOWdocker-compose.yml41 # Playwright proxy settings playwright_proxy_server, playwright_proxy_bypass, playwright_proxy_username, playwri
LOWdocker-compose.yml61 # Default number of parallel/concurrent fetchers
LOWdocker-compose.yml81 #
LOWdocker-compose.yml101
LOWdocker-compose.yml121# restart: unless-stopped
LOWdocker-compose.yml141# --headless
LOWdocs/api-spec.yaml801 - null: Not decided yet / inherit default behavior
LOW.github/workflows/codeql-analysis.yml1# For most projects, this workflow file will not need changing; you simply need
LOW.github/workflows/codeql-analysis.yml41 # By default, queries listed here will override any specified in a config file.
LOW.github/workflows/test-only.yml61 run: |
LOW.github/actions/extract-memory-report/action.yml41# sed 's/.*Peak memory: //' | \
LOWchangedetectionio/__init__.py21# Note: store and changedetection_app are imported inside main() to avoid
LOWchangedetectionio/__init__.py41# - Consistent across all platforms (Windows already uses spawn by default)
LOWchangedetectionio/forms.py461 # some_object = klass()
LOWchangedetectionio/html_tools.py361 # - local-name(): //*[local-name()='title']/text()
LOWchangedetectionio/notification/handler.py381 if _llm_change_summary and _override_diff:
LOW…etectionio/tests/test_automatic_follow_ldjson_price.py181 </body></html>
LOW…etectionio/tests/test_automatic_follow_ldjson_price.py201 # "offeredBy": {
LOWchangedetectionio/tests/proxy_list/conftest.py1#!/usr/bin/env python3
LOWchangedetectionio/tests/custom_browser_url/__init__.py1# placeholder
LOWchangedetectionio/processors/restock_diff/processor.py61# MEMORY MANAGEMENT: Why We Use Multiprocessing (Linux Only)
LOWchangedetectionio/processors/restock_diff/processor.py81# When a subprocess exits, the OS forcibly reclaims ALL memory including C-level
LOWchangedetectionio/processors/restock_diff/processor.py101# - The leak is specifically from lxml's document parsing, not the JSONPath queries
LOWchangedetectionio/processors/restock_diff/processor.py441# from ...html_tools import html_to_text
LOW…ngedetectionio/static/styles/scss/parts/_sub_tabs.scss1// ── Vertical sub-tab layout ───────────────────────────────────────────────────
LOWchangedetectionio/conditions/plugins/__init__.py1# Import plugins package to make them discoverable
LOWchangedetectionio/api/Watch.py281 if content:
LOWchangedetectionio/blueprint/browser_steps/__init__.py1
LOWchangedetectionio/store/file_saving_datastore.py121 try:
Hallucination Indicators3 hits · 30 pts
SeverityFileLineSnippet
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):f
CRITICALchangedetectionio/blueprint/settings/__init__.py62 form.application.form.notification_format.choices.pop()
CRITICALchangedetectionio/blueprint/settings/__init__.py70 form.requests.form.proxy.choices.append(tuple((p, datastore.proxy_list[p]['label'])))
Verbosity Indicators18 hits · 28 pts
SeverityFileLineSnippet
LOWchangedetectionio/worker.py479 # Step 1: AI Change Intent — may suppress notification
LOWchangedetectionio/worker.py500 # Step 2: AI Change Summary — runs for any LLM-configured watch with a change
LOWchangedetectionio/__init__.py410 # Step 1: Add URLs with their options (if provided via -u flags)
LOWchangedetectionio/__init__.py430 # Step 2: Queue newly added watches (if -u was provided in batch mode)
LOWchangedetectionio/__init__.py447 # Step 3: Queue watches for recheck (if -r was provided)
LOWchangedetectionio/__init__.py486 # Step 4: Setup batch mode monitor (if -b was provided)
LOWchangedetectionio/tests/test_extract_regex.py477 # Step 1: keep lines containing "price" (excludes Stock count and Shipping cost)
LOWchangedetectionio/tests/test_extract_regex.py479 # Step 2: from those lines extract only dollar amounts
LOWchangedetectionio/tests/test_i18n.py83 # Step 1: Set the language to Italian using the /set-language endpoint
LOWchangedetectionio/tests/test_i18n.py91 # Step 2: Request the index page - should be in Italian
LOWchangedetectionio/tests/test_i18n.py105 # Step 3: Switch back to English
LOWchangedetectionio/tests/test_i18n.py560 # Step 1: Clear session and make first request with zh-TW header (auto-detect)
LOWchangedetectionio/tests/test_i18n.py578 # Step 2: User explicitly selects Korean language
LOWchangedetectionio/tests/test_i18n.py587 # Step 3: Make another request with same zh-TW header
LOWchangedetectionio/processors/restock_diff/processor.py223 # Step 1: Try pure Python extraction first (fast, no lxml, no memory leak)
LOWchangedetectionio/processors/restock_diff/processor.py244 # Step 2: Fall back to extruct (uses lxml, needs subprocess on Linux)
LOWchangedetectionio/blueprint/ui/diff.py59 # Step 1: Escape everything like Jinja2 would (this makes it XSS-safe)
LOWchangedetectionio/blueprint/ui/diff.py62 # Step 2: Unescape only our exact diff spans generated by apply_html_color_to_body()
AI Slop Vocabulary9 hits · 16 pts
SeverityFileLineSnippet
MEDIUMchangedetectionio/worker_pool.py291 """Bulletproof queue operation with comprehensive error handling"""
LOWchangedetectionio/html_tools.py465 # Foreach <script json></script> blob.. just return the first that matches json_filter
LOWchangedetectionio/content_fetchers/requests.py198 # Binary files just return their checksum until we add something smarter
LOWchangedetectionio/notification/__init__.py8# But to avoid importing the whole heavy module just use the same strings here.
LOWchangedetectionio/tests/test_request.py9# Hard to just add more live server URLs when one test is already running (I think)
MEDIUMchangedetectionio/tests/test_history_consistency.py49 # Essentially just triggers the DB write/update
LOWchangedetectionio/tests/test_notification.py23# Hard to just add more live server URLs when one test is already running (I think)
MEDIUMchangedetectionio/processors/magic.py64 # Remove whitespace between < and tag name for robust detection (handles '< html', '<\nhtml', etc.)
LOWchangedetectionio/conditions/blueprint.py35 # We'll ignore the returned response and just use the datastore which is modified by the function
Slop Phrases1 hit · 2 pts
SeverityFileLineSnippet
LOWchangedetectionio/content_fetchers/__init__.py48 # In this case, make sure to edit the default one in store.py and fetch_site_status.py