🕵️♂️ Collect a dossier on a person by username from 6K websites
This report summarizes scanner evidence for soxoj/maigret, a Python project with 38,715 GitHub stars. SynthScan examined 31,841 lines of code across 108 source files, recording 613 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 22.5 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 489 finding(s).
Are imports declared and package/API names verified? 34 finding(s).
Are wrappers, guards, and repeated structures necessary? 530 finding(s).
Which changes need focused human review? 613 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 613 distinct pattern matches across 12 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | maigret/submit.py | 83 | def generate_additional_fields_dialog(self, engine: MaigretEngine, dialog): | CODE |
| LOW | maigret/submit.py | 160 | async def get_html_response_to_compare( | CODE |
| LOW | maigret/notify.py | 58 | def make_colored_terminal_notify( | CODE |
| LOW | maigret/notify.py | 68 | def make_simple_terminal_notify( | CODE |
| LOW | maigret/checking.py | 138 | def build_cloudflare_bypass_config( | CODE |
| LOW | maigret/sites.py | 164 | def __is_equal_by_url_or_name(self, url_or_name_str: str): | CODE |
| LOW | maigret/report.py | 54 | def sort_report_by_data_points(results): | CODE |
| LOW | maigret/report.py | 100 | def _is_safe_report_image_url(uri) -> bool: | CODE |
| LOW | maigret/report.py | 141 | def _pdf_report_link_callback(uri, rel): | CODE |
| LOW⚡ | maigret/web/app.py | 273 | async def search_multiple_usernames(usernames, options): | CODE |
| LOW⚡ | maigret/web/app.py | 284 | def sanitize_username_for_path(username: str) -> str: | CODE |
| LOW | pyinstaller/maigret_standalone.py | 20 | def _launched_by_double_click() -> bool: | STRING |
| LOW | tests/test_error_detection.py | 43 | def test_pow_challenge_pages_are_bot_protection(): | CODE |
| LOW | tests/test_error_detection.py | 70 | def test_google_recaptcha_interstitial_is_a_captcha(): | CODE |
| LOW | tests/test_error_detection.py | 82 | def test_page_embedding_a_recaptcha_widget_is_not_an_error(): | CODE |
| LOW⚡ | tests/test_workflows.py | 90 | def test_dev_build_is_a_prerelease(release_step): | CODE |
| LOW⚡ | tests/test_workflows.py | 96 | def test_dev_build_never_claims_the_latest_marker(release_step): | CODE |
| LOW⚡ | tests/test_workflows.py | 100 | def test_release_tag_does_not_shadow_a_branch(workflow, release_step): | CODE |
| LOW | tests/test_workflows.py | 111 | def test_release_tag_is_moved_to_the_built_commit(workflow, release_step): | CODE |
| LOW | tests/test_workflows.py | 127 | def test_every_release_step_is_guarded_by_event(workflow): | CODE |
| LOW | tests/test_workflows.py | 137 | def test_published_release_keeps_the_metadata_it_was_given(published_release_step): | CODE |
| LOW | tests/test_workflows.py | 153 | def test_published_release_targets_the_published_tag(published_release_step): | CODE |
| LOW⚡ | tests/test_utils.py | 21 | def test_case_convert_camel_to_snake(): | CODE |
| LOW⚡ | tests/test_utils.py | 28 | def test_case_convert_snake_to_camel(): | CODE |
| LOW⚡ | tests/test_utils.py | 35 | def test_case_convert_snake_to_title(): | CODE |
| LOW⚡ | tests/test_utils.py | 42 | def test_case_convert_camel_with_digits_to_snake(): | CODE |
| LOW⚡ | tests/test_utils.py | 95 | def test_enrich_link_str_non_link_is_plain_str(): | CODE |
| LOW⚡ | tests/test_utils.py | 104 | def test_url_extract_main_part_negative(): | CODE |
| LOW⚡ | tests/test_utils.py | 109 | def test_url_extract_main_part(): | CODE |
| LOW⚡ | tests/test_utils.py | 210 | def test_is_plausible_username_accepts_bare_usernames(): | CODE |
| LOW⚡ | tests/test_utils.py | 217 | def test_is_plausible_username_rejects_urls(): | CODE |
| LOW⚡ | tests/test_utils.py | 224 | def test_is_plausible_username_accepts_http_prefixed_handles(): | CODE |
| LOW⚡ | tests/test_utils.py | 232 | def test_is_plausible_username_rejects_path_like(): | CODE |
| LOW⚡ | tests/test_utils.py | 237 | def test_is_plausible_username_rejects_emails(): | CODE |
| LOW⚡ | tests/test_utils.py | 242 | def test_is_plausible_username_rejects_whitespace_and_empty(): | CODE |
| LOW⚡ | tests/test_utils.py | 249 | def test_is_plausible_username_rejects_non_strings(): | CODE |
| LOW⚡ | tests/test_utils.py | 255 | def test_get_dict_ascii_tree_new_line_false_strips_leading_newline(): | CODE |
| LOW⚡ | tests/test_utils.py | 295 | def test_read_input_file_keeps_values_with_colons(tmp_path): | CODE |
| LOW⚡ | tests/test_utils.py | 305 | def test_read_input_file_warns_on_a_misspelled_id_type(tmp_path, capsys): | CODE |
| LOW⚡ | tests/test_utils.py | 313 | def test_read_input_file_stdin(monkeypatch): | CODE |
| LOW | tests/test_utils.py | 59 | def test_is_country_tag_field_names_are_not_country_codes(): | CODE |
| LOW | tests/test_utils.py | 83 | def test_enrich_link_str_escapes_payload(): | CODE |
| LOW | tests/test_utils.py | 128 | def test_url_extract_main_part_keeps_host_starting_with_prefix_letters(): | CODE |
| LOW | tests/test_utils.py | 139 | def test_url_make_profile_url_regexp(): | CODE |
| LOW | tests/test_utils.py | 196 | def test_get_dict_ascii_tree_handles_non_string_values(): | CODE |
| LOW | tests/test_utils.py | 284 | def test_read_input_file_with_id_types(tmp_path): | CODE |
| LOW | tests/conftest.py | 48 | def pytest_collection_modifyitems(items): | CODE |
| LOW | tests/conftest.py | 52 | def get_test_reports_filenames(): | CODE |
| LOW | tests/conftest.py | 100 | def httpserver_listen_address(): | CODE |
| LOW | tests/test_sites.py | 38 | def test_load_empty_db_from_str(): | CODE |
| LOW | tests/test_sites.py | 68 | def test_site_correct_initialization(): | CODE |
| LOW | tests/test_sites.py | 81 | def test_site_stats_are_instance_local(): | CODE |
| LOW | tests/test_sites.py | 91 | def test_site_default_check_type_and_engine_precedence(): | CODE |
| LOW | tests/test_sites.py | 112 | def test_site_strip_engine_data(): | CODE |
| LOW | tests/test_sites.py | 122 | def test_saving_database_preserves_site_url_detector(tmp_path): | CODE |
| LOW | tests/test_sites.py | 135 | def test_site_strip_engine_data_with_site_prior_updates(): | CODE |
| LOW | tests/test_sites.py | 163 | def test_site_scalar_field_wins_over_engine(caplog): | CODE |
| LOW | tests/test_sites.py | 198 | def test_strip_engine_data_keeps_site_override(): | CODE |
| LOW | tests/test_sites.py | 227 | def test_constructor_defaults_do_not_count_as_site_overrides(caplog): | CODE |
| LOW | tests/test_sites.py | 247 | def test_update_from_engine_warns_on_conflicting_dict_entries(caplog): | CODE |
| 375 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | maigret/checking.py | 399 | except aiodns.error.DNSError: | CODE |
| HIGH | maigret/executors.py | 97 | except asyncio.TimeoutError: | CODE |
| HIGH | maigret/db_updater.py | 128 | except Exception: | CODE |
| HIGH | maigret/db_updater.py | 183 | except OSError: | CODE |
| HIGH | maigret/db_updater.py | 195 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | maigret/db_updater.py | 84 | except OSError: | CODE |
| HIGH | maigret/settings.py | 76 | except FileNotFoundError: | CODE |
| HIGH | maigret/report.py | 994 | except FileNotFoundError: | CODE |
| HIGH | pyinstaller/maigret_standalone.py | 41 | except EOFError: | CODE |
| HIGH | tests/test_checking.py | 1180 | except Exception: | CODE |
| HIGH | tests/test_checking.py | 1202 | except Exception: | CODE |
| HIGH | tests/test_checking.py | 1265 | except Exception: | CODE |
| HIGH | tests/test_checking.py | 1290 | except Exception: | CODE |
| HIGH | tests/test_submit.py | 541 | except Exception: | CODE |
| HIGH | utils/site_check.py | 47 | except ImportError: | CODE |
| HIGH | utils/site_check.py | 650 | except Exception: | CODE |
| HIGH | utils/import_sites.py | 279 | except asyncio.exceptions.TimeoutError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | maigret/submit.py | 205 | except Exception as e: | CODE |
| LOW | maigret/ai.py | 193 | except Exception: | CODE |
| MEDIUM | maigret/checking.py | 1740 | def extract_ids_data(html_text, logger, site) -> Dict: | CODE |
| LOW | maigret/checking.py | 322 | except Exception as e: | CODE |
| LOW | maigret/checking.py | 401 | except Exception as e: | CODE |
| LOW | maigret/checking.py | 490 | except Exception as e: | CODE |
| LOW | maigret/checking.py | 661 | except Exception as e: | CODE |
| LOW | maigret/checking.py | 715 | except Exception as e: | CODE |
| LOW | maigret/checking.py | 1152 | except Exception as e: | CODE |
| LOW | maigret/checking.py | 1615 | except Exception as e: | CODE |
| LOW | maigret/checking.py | 1688 | except Exception as e: | CODE |
| LOW | maigret/checking.py | 1743 | except Exception as e: | CODE |
| LOW | maigret/checking.py | 1775 | except Exception as e: | CODE |
| LOW | maigret/checking.py | 1908 | except Exception as e: | CODE |
| LOW | maigret/checking.py | 1937 | except Exception as e: | CODE |
| LOW | maigret/executors.py | 70 | except Exception as e: | CODE |
| LOW | maigret/db_updater.py | 128 | except Exception: | CODE |
| LOW | maigret/db_updater.py | 176 | except Exception: | CODE |
| MEDIUM | maigret/db_updater.py | 66 | def _load_state() -> dict: | CODE |
| LOW | maigret/utils.py | 238 | except Exception as e: | CODE |
| LOW | maigret/sites.py | 597 | except Exception as error: | CODE |
| LOW | maigret/sites.py | 627 | except Exception as error: | CODE |
| LOW | maigret/sites.py | 637 | except Exception as error: | CODE |
| LOW | maigret/sites.py | 653 | except Exception as error: | CODE |
| LOW | maigret/settings.py | 79 | except Exception as error: | CODE |
| LOW | maigret/maigret.py | 74 | except Exception as e: | CODE |
| LOW | maigret/maigret.py | 735 | except Exception as e: | CODE |
| LOW | maigret/maigret.py | 1178 | except Exception as e: | CODE |
| LOW | maigret/report.py | 324 | except Exception as e: | CODE |
| LOW | maigret/report.py | 709 | except Exception as e: | CODE |
| LOW | maigret/report.py | 735 | except Exception as e: | CODE |
| LOW⚡ | maigret/web/app.py | 268 | except Exception as e: | CODE |
| LOW⚡ | maigret/web/app.py | 279 | except Exception as e: | CODE |
| LOW | maigret/web/app.py | 392 | except Exception as e: | CODE |
| LOW | maigret/web/app.py | 452 | except Exception as e: | CODE |
| LOW | maigret/web/app.py | 470 | except Exception as e: | CODE |
| LOW | maigret/web/app.py | 483 | except Exception as e: | CODE |
| LOW | maigret/web/app.py | 697 | except Exception as e: | CODE |
| MEDIUM | maigret/web/app.py | 167 | def parse_settings_form(form): | CODE |
| LOW | pyinstaller/maigret_standalone.py | 34 | except Exception: | STRING |
| LOW | tests/test_checking.py | 1180 | except Exception: | CODE |
| LOW | tests/test_checking.py | 1202 | except Exception: | CODE |
| LOW | tests/test_checking.py | 1265 | except Exception: | CODE |
| LOW | tests/test_checking.py | 1290 | except Exception: | CODE |
| LOW | tests/test_submit.py | 541 | except Exception: | CODE |
| LOW | tests/test_data.py | 93 | except Exception: | CODE |
| LOW | utils/check_top_n.py | 115 | except Exception as e: | CODE |
| LOW | utils/check_top_n.py | 125 | except Exception as e: | CODE |
| LOW | utils/check_top_n.py | 176 | except Exception as e: | CODE |
| LOW | utils/update_site_data.py | 109 | except Exception as e: | CODE |
| LOW | utils/update_site_data.py | 121 | except Exception: | CODE |
| LOW | utils/update_site_data.py | 309 | except Exception as e: | STRING |
| MEDIUM | utils/update_site_data.py | 115 | def get_base_domain(url): | CODE |
| LOW | utils/site_check.py | 148 | except Exception as e: | CODE |
| LOW | utils/site_check.py | 158 | except Exception as e: | CODE |
| LOW | utils/site_check.py | 219 | except Exception as e: | CODE |
| LOW | utils/site_check.py | 650 | except Exception: | CODE |
| LOW | utils/import_sites.py | 87 | except Exception as e: | CODE |
| MEDIUM | utils/import_sites.py | 254 | # print(f'Error: {str(e)}') | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_checking.py | 1131 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_checking.py | 1137 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_checking.py | 1213 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_checking.py | 1218 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_idempotent_writes.py | 24 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_idempotent_writes.py | 26 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_idempotent_writes.py | 185 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_idempotent_writes.py | 187 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_keyword_filtering.py | 133 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_keyword_filtering.py | 136 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_maigret.py | 249 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_maigret.py | 259 | # ----------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | maigret/submit.py | 6 | CODE | |
| LOW | maigret/submit.py | 13 | CODE | |
| LOW | maigret/__init__.py | 9 | CODE | |
| LOW | maigret/__init__.py | 22 | CODE | |
| LOW | maigret/__init__.py | 23 | CODE | |
| LOW | maigret/__init__.py | 23 | CODE | |
| LOW | maigret/__init__.py | 23 | CODE | |
| LOW | maigret/__init__.py | 24 | CODE | |
| LOW | maigret/__init__.py | 11 | CODE | |
| LOW | maigret/result.py | 11 | CODE | |
| LOW | maigret/result.py | 12 | CODE | |
| LOW | maigret/maigret.py | 10 | CODE | |
| LOW | maigret/maigret.py | 60 | CODE | |
| LOW | tests/test_permutator.py | 1 | CODE | |
| LOW | tests/test_db_updater.py | 4 | CODE | |
| LOW | tests/test_db_updater.py | 9 | CODE | |
| LOW | tests/test_db_updater.py | 12 | CODE | |
| LOW | tests/test_db_updater.py | 12 | CODE | |
| LOW | tests/test_db_updater.py | 12 | CODE | |
| LOW | tests/test_web.py | 13 | CODE | |
| LOW | tests/test_cloudflare_webgate.py | 3 | CODE | |
| LOW | tests/test_cli.py | 6 | CODE | |
| LOW | tests/test_maigret.py | 17 | CODE | |
| LOW | utils/fp_probe_top_sites.py | 12 | CODE | |
| LOW | utils/update_site_data.py | 14 | CODE | |
| LOW | utils/site_check.py | 22 | CODE | |
| LOW | utils/site_check.py | 22 | CODE | |
| LOW | utils/site_check.py | 37 | CODE | |
| LOW | utils/site_check.py | 38 | CODE | |
| LOW | utils/site_check.py | 38 | CODE | |
| LOW | utils/site_check.py | 38 | CODE | |
| LOW | utils/site_check.py | 44 | CODE | |
| LOW | utils/site_check.py | 45 | CODE | |
| LOW | utils/import_sites.py | 11 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | maigret/submit.py | 95 | CODE | |
| LOW | maigret/notify.py | 162 | CODE | |
| LOW | maigret/checking.py | 755 | CODE | |
| LOW | maigret/checking.py | 926 | CODE | |
| LOW | maigret/checking.py | 1459 | CODE | |
| LOW | maigret/checking.py | 1631 | CODE | |
| LOW | maigret/checking.py | 1761 | CODE | |
| LOW | maigret/checking.py | 1916 | CODE | |
| LOW | maigret/checking.py | 433 | CODE | |
| LOW | maigret/utils.py | 208 | CODE | |
| LOW | maigret/sites.py | 315 | CODE | |
| LOW | maigret/sites.py | 356 | CODE | |
| LOW | maigret/sites.py | 685 | CODE | |
| LOW | maigret/maigret.py | 597 | CODE | |
| LOW | maigret/permutator.py | 10 | CODE | |
| LOW | maigret/report.py | 259 | CODE | |
| LOW | maigret/report.py | 499 | CODE | |
| LOW | maigret/report.py | 664 | CODE | |
| LOW | maigret/report.py | 946 | CODE | |
| LOW | maigret/report.py | 1018 | CODE | |
| LOW | maigret/report.py | 303 | CODE | |
| LOW | tests/test_data.py | 84 | CODE | |
| LOW | utils/check_top_n.py | 132 | CODE | |
| LOW | utils/update_site_data.py | 179 | CODE | |
| LOW | utils/site_check.py | 417 | CODE | |
| LOW | utils/site_check.py | 656 | CODE | |
| LOW | utils/selfcheck_triage.py | 28 | CODE | |
| LOW | utils/selfcheck_triage.py | 50 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_submit.py | 24 | # Create the Submitter instance | COMMENT |
| MEDIUM | tests/test_submit.py | 48 | # Create the Submitter instance without engines | COMMENT |
| MEDIUM | tests/test_submit.py | 276 | # Initialize necessary objects | COMMENT |
| MEDIUM | tests/test_submit.py | 328 | # Initialize necessary objects | COMMENT |
| MEDIUM | tests/test_submit.py | 386 | # Initialize necessary objects | COMMENT |
| MEDIUM | utils/site_check.py | 194 | # Create a simple notifier | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | maigret/submit.py | 457 | # Check if the site check is ordinary or not | COMMENT |
| LOW | maigret/notify.py | 191 | # Check if this is a keyword match | COMMENT |
| LOW | maigret/executors.py | 79 | # Add tasks to the queue | COMMENT |
| LOW | maigret/db_updater.py | 272 | # Check if update available | COMMENT |
| LOW | maigret/web/app.py | 642 | # Check if job is completed | COMMENT |
| LOW | utils/check_top_n.py | 247 | # Check if status_code would work | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | maigret/checking.py | 61 | COMMENT | |
| LOW | maigret/checking.py | 261 | # new exit node. A generic ProxyError (e.g. bad credentials) is | COMMENT |
| LOW | maigret/checking.py | 1381 | # ctrl_c=False is critical: alive_progress's default Ctrl+C handler | COMMENT |
| LOW | maigret/executors.py | 41 | # Deliberately asyncio.wait(), not wait_for(): wait_for's | COMMENT |
| LOW | tests/test_maigret.py | 241 | COMMENT | |
| LOW | docs/source/_static/maigret_search_help.js | 1 | // Show a helper when a docs search returns zero results. | COMMENT |
| LOW | .github/workflows/codeql-analysis.yml | 1 | # For most projects, this workflow file will not need changing; you simply need | COMMENT |
| LOW | .github/workflows/codeql-analysis.yml | 41 | - name: Initialize CodeQL | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | maigret/notify.py | 267 | CODE | |
| LOW | maigret/checking.py | 1214 | CODE | |
| LOW | maigret/checking.py | 1459 | CODE | |
| LOW | maigret/checking.py | 1631 | CODE | |
| LOW | maigret/utils.py | 71 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_checking.py | 222 | # should swallow the error and just return empty | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | maigret/sites.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/test_executors.py | 10 | logger = logging.getLogger(__name__) | CODE |