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.1 Strong AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of dgtlmoon/changedetection.io, a Python project with 33,389 GitHub stars. SynthScan v2.0 examined 101,812 lines of code across 482 source files, recording 2319 pattern matches distributed across 21 syntactic categories. The overall adjusted score of 34.1 places this repository in the Strong AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

34.1
Adjusted Score
34.1
Raw Score
100%
Time Factor
2026-08-27
Last Push
33.4K
Stars
Python
Language
101.8K
Lines of Code
482
Files
2.3K
Pattern Hits
2026-08-29
Scan Date
0.27
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 3HIGH 126MEDIUM 280LOW 1910

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 2319 distinct pattern matches across 21 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers931 hits · 894 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/pluggy_interface.py280def inject_datastore_into_plugins(datastore):CODE
LOWchangedetectionio/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
LOWchangedetectionio/worker.py785async def send_content_changed_notification(watch_uuid, notification_q, datastore):CODE
LOWchangedetectionio/worker.py798async def send_filter_failure_notification(watch_uuid, notification_q, datastore):CODE
LOWchangedetectionio/worker.py811async def send_step_failure_notification(watch_uuid, step_n, notification_q, datastore):CODE
LOWchangedetectionio/worker.py31def 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
LOWchangedetectionio/worker_pool.py134async def start_single_async_worker(worker_id, update_q, notification_q, app, datastore, executor=None):CODE
LOWchangedetectionio/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
LOWchangedetectionio/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.py260 def set_random_for_validation(self):CODE
LOWchangedetectionio/notification_service.py278def add_rendered_diff_to_notification_vars(notification_scan_text:str, prev_snapshot:str, current_snapshot:str, word_difCODE
LOWchangedetectionio/notification_service.py343def set_basic_notification_vars(current_snapshot, prev_snapshot, watch, triggered_text, timestamp_changed=None):CODE
LOWchangedetectionio/notification_service.py374 def queue_notification_for_watch(self, n_object: NotificationContextData, watch, date_index_from=-2, date_index_to=-CODE
LOWchangedetectionio/notification_service.py431 def send_content_changed_notification(self, watch_uuid):CODE
LOWchangedetectionio/notification_service.py475 def send_filter_failure_notification(self, watch_uuid):CODE
LOWchangedetectionio/notification_service.py522 def send_step_failure_notification(self, watch_uuid, step_n):STRING
LOWchangedetectionio/notification_service.py570def create_notification_service(datastore, notification_q):STRING
LOWchangedetectionio/validate_url.py203def is_url_private_or_parser_confused(url):CODE
LOWchangedetectionio/__init__.py516 def queue_watches_for_recheck(datastore, iteration):CODE
LOWchangedetectionio/forms.py878# def validate_notification_urls(self, field):COMMENT
LOWchangedetectionio/forms.py259def validate_time_between_check_has_values(form):CODE
LOWchangedetectionio/html_tools.py205def perl_style_slash_enclosed_regex_to_options(regex):CODE
LOWchangedetectionio/html_tools.py255def subtractive_xpath_selector(selectors: List[str], html_content: str) -> str:CODE
LOWchangedetectionio/html_tools.py511def _sanitize_lone_surrogates(value):CODE
LOWchangedetectionio/html_tools.py562def _get_stripped_text_from_json_match(match):CODE
LOWchangedetectionio/html_tools.py583def extract_json_blob_from_html(content, ensure_is_ldjson_info_type, json_filter):CODE
LOWchangedetectionio/html_tools.py760def cdata_in_document_to_text(html_content: str, render_anchor_tag_content=False) -> str:CODE
LOWchangedetectionio/html_tools.py852def workarounds_for_obfuscations(content):CODE
LOWchangedetectionio/auth_decorator.py16def login_optionally_required(func):CODE
LOWchangedetectionio/languages.py72def _build_short_timeago_rows():CODE
LOWchangedetectionio/languages.py96def register_short_timeago_locale(flask_locale):CODE
LOWchangedetectionio/flask_app.py140def _configure_plugin_templates():CODE
LOWchangedetectionio/flask_app.py291def _get_watch_queue_position(watch_obj):CODE
LOWchangedetectionio/flask_app.py297def _get_current_worker_count():CODE
LOWchangedetectionio/flask_app.py610 def inject_llm_features_disabled():CODE
LOWchangedetectionio/flask_app.py615 def inject_has_visual_browser():CODE
LOWchangedetectionio/flask_app.py801 def before_request_handle_cookie_x_settings():CODE
LOWchangedetectionio/flask_app.py1216def ticker_thread_check_time_launch_checks():CODE
LOWchangedetectionio/llm/prompt_builder.py117def build_preview_system_prompt() -> str:CODE
LOWchangedetectionio/llm/prompt_builder.py134def build_change_summary_prompt(diff: str, custom_prompt: str,CODE
LOWchangedetectionio/llm/prompt_builder.py158def build_change_summary_system_prompt() -> str:CODE
LOWchangedetectionio/llm/prompt_builder.py200def build_setup_system_prompt() -> str:CODE
LOWchangedetectionio/llm/evaluator.py354def get_global_token_budget_month(datastore=None) -> int:CODE
LOWchangedetectionio/llm/evaluator.py165def apply_local_token_multiplier(base_max_tokens: int, llm_cfg: dict) -> int:CODE
LOWchangedetectionio/llm/evaluator.py436def is_global_token_budget_exceeded(datastore) -> bool:CODE
LOWchangedetectionio/llm/evaluator.py578def get_effective_summary_prompt(watch, datastore) -> str:CODE
LOWchangedetectionio/llm/evaluator.py599def compute_summary_cache_key(diff_text: str, prompt: str) -> str:CODE
871 more matches not shown…
Decorative Section Separators194 hits · 740 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
MEDIUMchangedetectionio/llm/evaluator.py345# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py347# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py545# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py547# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py745# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py747# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py802# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py804# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py243# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py245# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py286# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py288# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py454# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/llm/evaluator.py456# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py727 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py730 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py739 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py742 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py752 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py756 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py773 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py776 # ------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py863 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py865 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py872 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py874 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py886 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py888 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py892 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py894 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_security.py904 # ---------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/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
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py74# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py76# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py144# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py146# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py210# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py212# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py244# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py246# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py299# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py301# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py348# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py350# ---------------------------------------------------------------------------COMMENT
MEDIUMchangedetectionio/tests/test_llm_group_overrides.py23# ---------------------------------------------------------------------------COMMENT
134 more matches not shown…
Excessive Try-Catch Wrapping340 hits · 370 pts
SeverityFileLineSnippetContext
MEDIUMchangedetectionio/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
LOWchangedetectionio/worker.py794 except Exception as e:CODE
LOWchangedetectionio/worker.py807 except Exception as e:CODE
LOWchangedetectionio/worker.py820 except Exception as e:CODE
LOWchangedetectionio/worker.py120 except Exception as e:CODE
LOWchangedetectionio/worker.py135 except Exception as health_e:CODE
LOWchangedetectionio/worker.py403 except Exception as e:CODE
LOWchangedetectionio/worker.py525 except Exception as e:CODE
LOWchangedetectionio/worker.py581 except Exception as _fe:CODE
LOWchangedetectionio/worker.py598 except Exception as e:CODE
LOWchangedetectionio/worker.py616 except Exception as e:CODE
LOWchangedetectionio/worker.py629 except Exception as e:CODE
LOWchangedetectionio/worker.py656 except Exception as e:CODE
LOWchangedetectionio/worker.py679 except Exception as e:CODE
LOWchangedetectionio/worker.py703 except Exception as cleanup_error:CODE
LOWchangedetectionio/worker.py716 except Exception as finalize_error:CODE
LOWchangedetectionio/worker.py728 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
LOWchangedetectionio/worker_pool.py129 except Exception as e:CODE
LOWchangedetectionio/worker_pool.py368 except Exception as uuid_e:CODE
LOWchangedetectionio/worker_pool.py392 except Exception as e:CODE
LOWchangedetectionio/worker_pool.py400 except Exception as health_e:CODE
LOWchangedetectionio/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
LOWchangedetectionio/queue_handlers.py258 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py267 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py277 except Exception as e:CODE
LOWchangedetectionio/queue_handlers.py548 except Exception as e:CODE
LOWchangedetectionio/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
280 more matches not shown…
Magic Placeholder Names87 hits · 360 pts
SeverityFileLineSnippetContext
HIGHdocs/api-spec.yaml1323 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1327 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1331 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1336 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml2035 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml2041 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml2047 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml2055 '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.yaml907 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml912 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml980 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml995 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1044 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1049 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1106 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1118 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1164 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1169 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1202 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1207 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1244 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1249 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1527 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1533 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1567 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1572 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1606 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1616 '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.yaml1708 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1719 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1759 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1764 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1791 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1796 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml1816 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1829 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1870 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1882 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1918 -H "x-api-key: YOUR_API_KEY" \CODE
HIGHdocs/api-spec.yaml1930 'x-api-key': 'YOUR_API_KEY',CODE
HIGHdocs/api-spec.yaml1963 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml1968 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api-spec.yaml2134 -H "x-api-key: YOUR_API_KEY"CODE
HIGHdocs/api-spec.yaml2139 headers = {'x-api-key': 'YOUR_API_KEY'}CODE
HIGHdocs/api_v1/index.html978 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
HIGHdocs/api_v1/index.html982 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
HIGHdocs/api_v1/index.html986 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
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;CODE
HIGHdocs/api_v1/index.html473<p>For example: <code>x-api-key: YOUR_API_KEY</code></p>CODE
HIGHdocs/api_v1/index.html495 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
HIGHdocs/api_v1/index.html661 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
HIGHdocs/api_v1/index.html807 <span class="token operator">-</span>H <span class="token string">"x-api-key: YOUR_API_KEY"</span>CODE
27 more matches not shown…
Unused Imports305 hits · 288 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/worker.py328CODE
LOWchangedetectionio/worker.py404CODE
LOWchangedetectionio/worker.py457CODE
LOWchangedetectionio/queue_handlers.py3CODE
LOWchangedetectionio/gc_cleanup.py9CODE
LOWchangedetectionio/validate_url.py3CODE
LOWchangedetectionio/forms.py21CODE
LOWchangedetectionio/forms.py549CODE
LOWchangedetectionio/auth_decorator.py3CODE
LOWchangedetectionio/auth_decorator.py4CODE
LOWchangedetectionio/time_handler.py1CODE
LOWchangedetectionio/languages.py5CODE
LOWchangedetectionio/llm/evaluator.py39CODE
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.py10CODE
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.py309CODE
LOWchangedetectionio/notification/handler.py311CODE
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
245 more matches not shown…
Self-Referential Comments55 hits · 149 pts
SeverityFileLineSnippetContext
MEDIUM.github/workflows/test-stack-reusable-workflow.yml416 # Create a watch via API through nginx proxy subpathCOMMENT
MEDIUM.github/workflows/test-stack-reusable-workflow.yml741 # Create a watch with tag "github-group-test" via APICOMMENT
MEDIUM.github/workflows/test-stack-reusable-workflow.yml755 # 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__.py309 # Create the datadir if it doesnt existCOMMENT
MEDIUMchangedetectionio/test_cli_opts.sh148 # Create a watch using CLI, then recheck itCOMMENT
MEDIUMchangedetectionio/flask_app.py149 # Create a ChoiceLoader that searches app templates first, then plugin templatesCOMMENT
MEDIUMchangedetectionio/notification/handler.py110 # Define the mapping between your placeholders and markdown markersCOMMENT
MEDIUMchangedetectionio/notification/handler.py134 # 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
MEDIUMchangedetectionio/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
MEDIUMchangedetectionio/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.py618 # 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.py557 # Create a watchSTRING
MEDIUMchangedetectionio/tests/test_api.py936 # Create a watch in restock_diff mode WITH processor_config in the POST body (matches the API docs example)COMMENT
MEDIUMchangedetectionio/tests/test_api.py1120 # 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_summaryCOMMENT
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.py180 # Create a simplified watch data object to send to clientsCOMMENT
MEDIUMchangedetectionio/realtime/socket_server.py391 # Create a dedicated signal handler that will receive signals and emit them to clientsCOMMENT
MEDIUMchangedetectionio/processors/__init__.py469 # Create a processor instance to access config methodsCOMMENT
MEDIUMchangedetectionio/processors/base.py30 # 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__.py131 # Create the rulesetCOMMENT
MEDIUMchangedetectionio/model/__init__.py441 # Create a cached version if it doesn't existCOMMENT
MEDIUMchangedetectionio/model/Watch.py952 # Create a smaller intermediate image (to reduce memory usage)COMMENT
MEDIUMchangedetectionio/api/Watch.py73 # Create a dict copy for JSON response (with lock for thread safety)COMMENT
MEDIUMchangedetectionio/blueprint/ui/edit.py135 # 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__.py55 # Initialize parent classCOMMENT
Deep Nesting139 hits · 122 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/pluggy_interface.py244CODE
LOWchangedetectionio/pluggy_interface.py371CODE
LOWchangedetectionio/pluggy_interface.py563CODE
LOWchangedetectionio/worker.py46CODE
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__.py181CODE
LOWchangedetectionio/forms.py130CODE
LOWchangedetectionio/forms.py681CODE
LOWchangedetectionio/html_tools.py310CODE
LOWchangedetectionio/html_tools.py353CODE
LOWchangedetectionio/html_tools.py583CODE
LOWchangedetectionio/html_tools.py693CODE
LOWchangedetectionio/html_tools.py883CODE
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.py163CODE
LOWchangedetectionio/flask_app.py545CODE
LOWchangedetectionio/flask_app.py1162CODE
LOWchangedetectionio/flask_app.py1216CODE
LOWchangedetectionio/flask_app.py624CODE
LOWchangedetectionio/flask_app.py843CODE
LOWchangedetectionio/flask_app.py1051CODE
LOWchangedetectionio/llm/client.py66CODE
LOWchangedetectionio/content_fetchers/__init__.py39CODE
LOWchangedetectionio/content_fetchers/requests.py24CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py63CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py81CODE
LOWchangedetectionio/content_fetchers/base.py202CODE
LOWchangedetectionio/notification/handler.py153CODE
LOWchangedetectionio/notification/handler.py209CODE
LOWchangedetectionio/notification/handler.py307CODE
LOW…angedetectionio/notification/apprise_plugin/discord.py56CODE
LOW…angedetectionio/notification/apprise_plugin/discord.py200CODE
LOWchangedetectionio/tests/conftest.py43CODE
LOWchangedetectionio/tests/conftest.py404CODE
LOWchangedetectionio/tests/conftest.py439CODE
LOWchangedetectionio/tests/util.py245CODE
LOWchangedetectionio/tests/util.py257CODE
LOWchangedetectionio/tests/test_history_consistency.py13CODE
LOWchangedetectionio/tests/test_basic_socketio.py13CODE
LOW…ngedetectionio/tests/unit/test_auth_decorator_order.py50CODE
LOWchangedetectionio/tests/smtp/smtp-test-server.py17CODE
LOWchangedetectionio/diff/__init__.py79CODE
LOWchangedetectionio/diff/__init__.py309CODE
LOWchangedetectionio/diff/tokenizers/words_and_html.py13CODE
LOWchangedetectionio/realtime/events.py6CODE
LOWchangedetectionio/realtime/events.py10CODE
LOWchangedetectionio/realtime/socket_server.py84CODE
LOWchangedetectionio/processors/magic.py59CODE
79 more matches not shown…
Redundant / Tautological Comments73 hits · 116 pts
SeverityFileLineSnippetContext
LOW.github/workflows/test-stack-reusable-workflow.yml143 # Check if RSS is less than 100MBCOMMENT
LOWchangedetectionio/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
LOWchangedetectionio/worker.py752 # Check if we should restart (only when idle, between jobs)COMMENT
LOWchangedetectionio/worker.py761 # Check if we should exitCOMMENT
LOWchangedetectionio/worker.py765 # Check if we're in pytest environment - if so, be more gentle with loggingCOMMENT
LOWchangedetectionio/worker_pool.py138 # Check if we're in pytest environment - if so, be more gentle with loggingCOMMENT
LOWchangedetectionio/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__.py575 # Check if we need to repeatCOMMENT
LOWchangedetectionio/html_tools.py263 # Iterate over the list of XPath selectorsCOMMENT
LOWchangedetectionio/time_handler.py55 # Check if the current day matches the target day or overlaps due to durationCOMMENT
LOWchangedetectionio/languages.py176 # Check if messages.po existsCOMMENT
LOWchangedetectionio/flask_app.py425 # Check if it's a built-in fetcherCOMMENT
LOWchangedetectionio/flask_app.py720 # Check if there's a redirect parameter to return to after re-loginCOMMENT
LOWchangedetectionio/flask_app.py753 # Check if there's a redirect parameter to return to the same pageCOMMENT
LOWchangedetectionio/flask_app.py940 # Check if file exists in plugin's static directoryCOMMENT
LOWchangedetectionio/flask_app.py1249 # Check if all checks are pausedCOMMENT
LOWchangedetectionio/browser_steps/browser_steps.py91 # Check if action handler existsCOMMENT
LOWchangedetectionio/browser_steps/browser_steps.py113 # Check if navigation actually occurredCOMMENT
LOWchangedetectionio/browser_steps/browser_steps.py442 # 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
LOWchangedetectionio/content_fetchers/puppeteer.py389 # Check if page still exists (might have been closed due to error during sleep)COMMENT
LOWchangedetectionio/content_fetchers/puppeteer.py419 # Check if page still exists before sending commandCOMMENT
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.py357 # Check if authentication is required and user is not authenticatedCOMMENT
LOWchangedetectionio/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.py37 # Check if this is a JSON-LD script tagCOMMENT
LOWchangedetectionio/model/__init__.py311 # Check if we're being initialized from an existing watch objectCOMMENT
13 more matches not shown…
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
Cross-Language Confusion14 hits · 71 pts
SeverityFileLineSnippetContext
HIGHchangedetectionio/forms.py604 f"The following tokens used in the notification are not valid: {undefined}"CODE
HIGHchangedetectionio/notification/handler.py475#@todo on null:// (only if its a 1 url with null) probably doesnt need to actually .add/setup/etcCOMMENT
HIGHchangedetectionio/tests/test_api_security.py499 # Should accept (empty is valid as null)STRING
HIGHchangedetectionio/tests/test_api.py1153 - CREATE endpoint rejects null, empty, and invalid URLsSTRING
HIGHchangedetectionio/tests/test_api.py1154 - 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
HIGHchangedetectionio/tests/test_llm_change_summary.py158 return JSON {"summary": null, "error": "<readable message>"} with a 500STRING
HIGHchangedetectionio/tests/llm/test_response_parser.py93 raw = '{"needs_prefilter": false, "selector": null, "reason": "intent is global"}'CODE
HIGHchangedetectionio/tests/llm/test_llm_restock_plugin.py141 llm_json = '{"price": null, "currency": null, "availability": "instock"}'CODE
HIGHchangedetectionio/tests/llm/test_llm_restock_plugin.py151 llm_json = '{"price": 19.95, "currency": "GBP", "availability": null}'CODE
HIGHchangedetectionio/tests/llm/test_llm_restock_plugin.py161 llm_json = '{"price": null, "currency": null, "availability": null}'CODE
HIGHchangedetectionio/tests/llm/test_llm_restock_plugin.py213 llm_json = '{"price": null, "currency": null, "availability": null}'CODE
HIGHchangedetectionio/api/Import.py39 - anyOf: [{type: string}, {type: null}] (anyOf format)STRING
HIGHchangedetectionio/blueprint/ui/diff.py181 Returns JSON: {"summary": "...", "error": null} or {"summary": null, "error": "..."}STRING
Fake / Example Data33 hits · 38 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/forms.py1090 self.time_schedule_limit.form.timezone.render_kw['placeholder'] = default_tzCODE
LOWchangedetectionio/forms.py1096 proxy_name = StringField(_l('Name'), [validators.Optional()], render_kw={"placeholder": _l("Name")})CODE
LOWchangedetectionio/forms.py1105 ], render_kw={"placeholder": "socks5:// or regular proxy http://user:pass@...:3128", "size":50})CODE
LOWchangedetectionio/forms.py1108 browser_name = StringField(_l('Name'), [validators.Optional()], render_kw={"placeholder": _l("Name")})CODE
LOWchangedetectionio/forms.py1117 ], render_kw={"placeholder": "wss://brightdata... wss://oxylabs etc", "size":50})CODE
LOWchangedetectionio/forms.py1120 html_requests = StringField(_l('Plaintext requests'), validators=[validators.Optional()], render_kw={"placeholder": CODE
LOWchangedetectionio/forms.py1122 html_webdriver = StringField(_l('Chrome requests'), validators=[validators.Optional()], render_kw={"placeholder"CODE
LOWchangedetectionio/forms.py1277 render_kw={"placeholder": "5", "style": "width: 6em;"},CODE
LOWchangedetectionio/forms.py1284 "placeholder": DEFAULT_CHANGE_SUMMARY_PROMPT,CODE
LOWchangedetectionio/forms.py1294 "placeholder": "0 = unlimited",CODE
LOWchangedetectionio/forms.py918 render_kw={"placeholder": os.getenv('BASE_URL', _l('Not set'))})CODE
LOWchangedetectionio/forms.py933 selector = StringField(_l('Selector'), [validators.Optional()], render_kw={"placeholder": _l("CSS or xPath selector"CODE
LOWchangedetectionio/forms.py934 optional_value = StringField(_l('value'), [validators.Optional()], render_kw={"placeholder": _l("Value")})CODE
LOWchangedetectionio/forms.py957 render_kw={"rows": "5", "placeholder": LLM_INTENT_WATCH_PLACEHOLDER})CODE
LOWchangedetectionio/forms.py960 render_kw={"rows": "5", "placeholder": DEFAULT_CHANGE_SUMMARY_PROMPT},CODE
LOWchangedetectionio/forms.py1174 render_kw={"placeholder": os.getenv('BASE_URL', _l('Not set'))}CODE
LOWchangedetectionio/forms.py1190 render_kw={"placeholder": "0.1", "style": "width: 8em;"}CODE
LOWchangedetectionio/forms.py1201 rss_template_override = TextAreaField(_l('RSS "System default" template override'), render_kw={"rows": "5", "placehoCODE
LOWchangedetectionio/forms.py1240 render_kw={"placeholder": "gpt-4o-mini", "style": "width: 24em;"},CODE
LOWchangedetectionio/forms.py1254 "placeholder": "http://localhost:11434 (Ollama / custom endpoints only)",CODE
LOWchangedetectionio/forms.py1309 "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
LOWchangedetectionio/processors/restock_diff/forms.py22 render_kw={"placeholder": _l("No limit"), "size": "10"})CODE
LOWchangedetectionio/processors/restock_diff/forms.py24 render_kw={"placeholder": _l("No limit"), "size": "10"})CODE
LOWchangedetectionio/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.html93 {% set summary_placeholder = form.llm_change_summary.render_kw['placeholder'] %}CODE
LOWchangedetectionio/blueprint/tags/form.py24 render_kw={"placeholder": _l("e.g. *://example.com/* or github.com/myorg")})CODE
LOWchangedetectionio/blueprint/tags/form.py33 render_kw={"rows": "5", "placeholder": LLM_INTENT_TAG_PLACEHOLDER})CODE
LOWchangedetectionio/blueprint/tags/form.py37 render_kw={"rows": "5", "placeholder": DEFAULT_CHANGE_SUMMARY_PROMPT},CODE
LOWchangedetectionio/blueprint/tags/form.py51 name = StringField(_l('Tag name'), [validators.InputRequired()], render_kw={"placeholder": _l("Name")})CODE
Structural Annotation Overuse19 hits · 37 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/worker.py485 # Step 1: AI Change Intent — may suppress notificationCOMMENT
LOWchangedetectionio/worker.py506 # Step 2: AI Change Summary — only compute it when a notificationCOMMENT
LOWchangedetectionio/__init__.py447 # Step 3: Queue watches for recheck (if -r was provided)COMMENT
LOWchangedetectionio/__init__.py486 # Step 4: Setup batch mode monitor (if -b was provided)COMMENT
LOWchangedetectionio/__init__.py410 # Step 1: Add URLs with their options (if provided via -u flags)COMMENT
LOWchangedetectionio/__init__.py430 # Step 2: Queue newly added watches (if -u was provided in batch mode)COMMENT
LOWchangedetectionio/tests/test_extract_regex.py477 # Step 1: keep lines containing "price" (excludes Stock count and Shipping cost)COMMENT
LOWchangedetectionio/tests/test_extract_regex.py479 # Step 2: from those lines extract only dollar amountsCOMMENT
LOWchangedetectionio/tests/test_i18n.py91 # Step 1: Set the language to Italian using the /set-language endpointCOMMENT
LOWchangedetectionio/tests/test_i18n.py99 # Step 2: Request the index page - should be in ItalianCOMMENT
LOWchangedetectionio/tests/test_i18n.py629 # Step 2: User explicitly selects Korean languageCOMMENT
LOWchangedetectionio/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
LOWchangedetectionio/processors/restock_diff/processor.py244 # Step 2: Fall back to extruct (uses lxml, needs subprocess on Linux)COMMENT
LOWchangedetectionio/processors/restock_diff/processor.py223 # 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
LOWchangedetectionio/blueprint/ui/diff.py60 # Step 1: Escape everything like Jinja2 would (this makes it XSS-safe)COMMENT
LOWchangedetectionio/blueprint/ui/diff.py63 # Step 2: Unescape only our exact diff spans generated by apply_html_color_to_body()COMMENT
Over-Commented Block41 hits · 36 pts
SeverityFileLineSnippetContext
LOWrequirements.txt61beautifulsoup4>=4.0.0,<=4.14.3COMMENT
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 # How much of the page text the AI reads when finding the price/stock, default 15000 characters.COMMENT
LOWdocker-compose.yml101 # - SSL_PRIVKEY_FILE=privkey.pemCOMMENT
LOWdocker-compose.yml121# browser-sockpuppet-chrome:COMMENT
LOWdocker-compose.yml141 # Note: Works well but is deprecated, does not fetch full page screenshots (doesnt work with Visual Selector)COMMENT
LOWdocs/api-spec.yaml821 # Future: Aggregated statistics from all watches with this tagCOMMENT
LOW.github/workflows/codeql-analysis.yml1# For most projects, this workflow file will not need changing; you simply needCOMMENT
LOW.github/workflows/codeql-analysis.yml41 # By default, queries listed here will override any specified in a config file.COMMENT
LOW.github/workflows/test-only.yml61 run: |COMMENT
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.py461COMMENT
LOWchangedetectionio/forms.py841 # leaves the new watch on 'system' exactly as before.COMMENT
LOWchangedetectionio/forms.py881# for url in field.data:COMMENT
LOWchangedetectionio/html_tools.py21# watch's page ends up inside another watch's snapshot.COMMENT
LOWchangedetectionio/html_tools.py381 # XPath spec: unprefixed element names have no namespace, not the default namespaceCOMMENT
LOWchangedetectionio/html_tools.py441 html_block = ""COMMENT
LOWchangedetectionio/content_fetchers/puppeteer.py361 # https://github.com/microsoft/playwright/issues/10567COMMENT
LOWchangedetectionio/notification/handler.py381 if _llm_change_summary and _override_diff:COMMENT
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.py61# MEMORY MANAGEMENT: Why We Use Multiprocessing (Linux Only)COMMENT
LOWchangedetectionio/processors/restock_diff/processor.py81# When a subprocess exits, the OS forcibly reclaims ALL memory including C-levelCOMMENT
LOWchangedetectionio/processors/restock_diff/processor.py101# - The leak is specifically from lxml's document parsing, not the JSONPath queriesCOMMENT
LOWchangedetectionio/processors/restock_diff/processor.py441COMMENT
LOW…ngedetectionio/static/styles/scss/parts/_sub_tabs.scss1// ── Vertical sub-tab layout ───────────────────────────────────────────────────COMMENT
LOW…ectionio/static/styles/scss/parts/_action_sidebar.scss41}COMMENT
LOWchangedetectionio/conditions/plugins/__init__.py1# Import plugins package to make them discoverableCOMMENT
LOWchangedetectionio/api/Watch.py281 if content:COMMENT
LOWchangedetectionio/blueprint/browser_steps/__init__.py1COMMENT
LOWchangedetectionio/store/file_saving_datastore.py121 try:COMMENT
Verbosity Indicators18 hits · 35 pts
SeverityFileLineSnippetContext
LOWchangedetectionio/worker.py485 # Step 1: AI Change Intent — may suppress notificationCOMMENT
LOWchangedetectionio/worker.py506 # Step 2: AI Change Summary — only compute it when a notificationCOMMENT
LOWchangedetectionio/__init__.py447 # Step 3: Queue watches for recheck (if -r was provided)COMMENT
LOWchangedetectionio/__init__.py486 # Step 4: Setup batch mode monitor (if -b was provided)COMMENT
LOWchangedetectionio/__init__.py410 # Step 1: Add URLs with their options (if provided via -u flags)COMMENT
LOWchangedetectionio/__init__.py430 # Step 2: Queue newly added watches (if -u was provided in batch mode)COMMENT
LOWchangedetectionio/tests/test_extract_regex.py477 # Step 1: keep lines containing "price" (excludes Stock count and Shipping cost)COMMENT
LOWchangedetectionio/tests/test_extract_regex.py479 # Step 2: from those lines extract only dollar amountsCOMMENT
LOWchangedetectionio/tests/test_i18n.py91 # Step 1: Set the language to Italian using the /set-language endpointCOMMENT
LOWchangedetectionio/tests/test_i18n.py99 # Step 2: Request the index page - should be in ItalianCOMMENT
LOWchangedetectionio/tests/test_i18n.py629 # Step 2: User explicitly selects Korean languageCOMMENT
LOWchangedetectionio/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
LOWchangedetectionio/processors/restock_diff/processor.py244 # Step 2: Fall back to extruct (uses lxml, needs subprocess on Linux)COMMENT
LOWchangedetectionio/processors/restock_diff/processor.py223 # Step 1: Try pure Python extraction first (fast, no lxml, no memory leak)COMMENT
LOWchangedetectionio/blueprint/ui/diff.py60 # Step 1: Escape everything like Jinja2 would (this makes it XSS-safe)COMMENT
LOWchangedetectionio/blueprint/ui/diff.py63 # Step 2: Unescape only our exact diff spans generated by apply_html_color_to_body()COMMENT
Docstring Block Structure7 hits · 35 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.py204 Extract itemprop availability with hybrid approach for memory efficiency. Strategy (fastest to slowest, least STRING
HIGHchangedetectionio/model/persistence.py13 Determine entity type from class hierarchy (cached at class level). Args: cls: The class to inspect STRING
HIGHchangedetectionio/model/Watch.py55 Save compressed data using native brotli with streaming compression. Uses chunked compression to minimize peak STRING
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.py272CODE
LOWchangedetectionio/content_fetchers/playwright.py250CODE
LOWchangedetectionio/content_fetchers/puppeteer.py509CODE
LOWchangedetectionio/content_fetchers/requests.py210CODE
LOW…angedetectionio/content_fetchers/webdriver_selenium.py63CODE
LOWchangedetectionio/content_fetchers/base.py159CODE
LOWchangedetectionio/tests/conftest.py321CODE
LOWchangedetectionio/tests/util.py375CODE
LOWchangedetectionio/diff/__init__.py309CODE
LOWchangedetectionio/diff/__init__.py424CODE
LOWchangedetectionio/processors/extract.py69CODE
LOW…ngedetectionio/processors/text_json_diff/difference.py246CODE
LOWchangedetectionio/model/Watch.py745CODE
LOWchangedetectionio/model/Watch.py1315CODE
LOWchangedetectionio/blueprint/ui/preview.py125CODE
LOWchangedetectionio/blueprint/ui/__init__.py227CODE
LOWchangedetectionio/blueprint/settings/__init__.py277CODE
LOWchangedetectionio/blueprint/settings/__init__.py294CODE
LOWchangedetectionio/blueprint/imports/__init__.py84CODE
LOWchangedetectionio/blueprint/tags/__init__.py40CODE
LOWchangedetectionio/blueprint/tags/__init__.py235CODE
LOWchangedetectionio/blueprint/backups/__init__.py177CODE
AI Slop Vocabulary10 hits · 18 pts
SeverityFileLineSnippetContext
MEDIUMchangedetectionio/worker_pool.py361 """Bulletproof queue operation with comprehensive error handling"""STRING
LOWchangedetectionio/html_tools.py587 # Foreach <script json></script> blob.. just return the first that matches json_filterCOMMENT
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-Vocabulary3 hits · 10 pts
SeverityFileLineSnippetContext
MEDIUMchangedetectionio/forms.py1267 # DeepSeek-R1, Gemma 3, etc.) which emit chain-of-thought intoCOMMENT
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__.py14__all__ = [CODE
LOWchangedetectionio/jinja2_custom/plugins/__init__.py6__all__ = ['regex_replace']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