Repository Analysis

laramies/theHarvester

E-mails, subdomains and names Harvester - OSINT

9.5 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of laramies/theHarvester, a Python project with 16,785 GitHub stars. SynthScan v2.0 examined 64,060 lines of code across 128 source files, recording 473 pattern matches distributed across 12 syntactic categories. The overall adjusted score of 9.5 places this repository in the Low 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).

9.5
Adjusted Score
9.5
Raw Score
100%
Time Factor
2026-07-06
Last Push
16.8K
Stars
Python
Language
64.1K
Lines of Code
128
Files
473
Pattern Hits
2026-07-14
Scan Date
0.00
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 0HIGH 0MEDIUM 91LOW 382

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 473 distinct pattern matches across 12 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.

Excessive Try-Catch Wrapping272 hits · 344 pts
SeverityFileLineSnippetContext
LOWtests/discovery/test_thc.py153 except Exception:CODE
LOWtests/discovery/test_thc.py166 except Exception:CODE
LOWtests/discovery/test_thc.py179 except Exception:CODE
LOWtests/discovery/test_thc.py192 except Exception:CODE
MEDIUMtheHarvester/__main__.py1090 print(f'Error in Shodan search: {e}')CODE
MEDIUMtheHarvester/__main__.py234 print(f'Error initializing StashManager: {init_error}')CODE
MEDIUMtheHarvester/__main__.py1951def entry_point() -> None:CODE
LOWtheHarvester/__main__.py1089 except Exception as e:CODE
LOWtheHarvester/__main__.py1097 except Exception as e:CODE
LOWtheHarvester/__main__.py448 except Exception as e:CODE
LOWtheHarvester/__main__.py462 except Exception as e:CODE
LOWtheHarvester/__main__.py476 except Exception as ex:CODE
LOWtheHarvester/__main__.py493 except Exception as e:CODE
LOWtheHarvester/__main__.py507 except Exception as e:CODE
LOWtheHarvester/__main__.py514 except Exception as e:CODE
LOWtheHarvester/__main__.py544 except Exception as e:CODE
LOWtheHarvester/__main__.py564 except Exception as e:CODE
LOWtheHarvester/__main__.py578 except Exception as e:CODE
LOWtheHarvester/__main__.py595 except Exception as e:CODE
LOWtheHarvester/__main__.py610 except Exception as e:CODE
LOWtheHarvester/__main__.py621 except Exception as e:CODE
LOWtheHarvester/__main__.py635 except Exception as e:CODE
LOWtheHarvester/__main__.py656 except Exception as e:CODE
LOWtheHarvester/__main__.py674 except Exception as e:CODE
LOWtheHarvester/__main__.py692 except Exception as e:CODE
LOWtheHarvester/__main__.py703 except Exception as e:CODE
LOWtheHarvester/__main__.py734 except Exception as e:CODE
LOWtheHarvester/__main__.py741 except Exception as e:CODE
LOWtheHarvester/__main__.py754 except Exception as e:CODE
LOWtheHarvester/__main__.py773 except Exception as e:CODE
LOWtheHarvester/__main__.py787 except Exception as e:CODE
LOWtheHarvester/__main__.py796 except Exception as e:CODE
LOWtheHarvester/__main__.py814 except Exception as e:CODE
LOWtheHarvester/__main__.py832 except Exception as e:CODE
LOWtheHarvester/__main__.py845 except Exception as e:CODE
LOWtheHarvester/__main__.py862 except Exception as e:CODE
LOWtheHarvester/__main__.py879 except Exception as e:CODE
LOWtheHarvester/__main__.py908 except Exception as e:CODE
LOWtheHarvester/__main__.py935 except Exception as e:CODE
LOWtheHarvester/__main__.py943 except Exception as e:CODE
LOWtheHarvester/__main__.py954 except Exception as e:CODE
LOWtheHarvester/__main__.py977 except Exception as e:CODE
LOWtheHarvester/__main__.py992 except Exception as e:CODE
LOWtheHarvester/__main__.py999 except Exception as e:CODE
LOWtheHarvester/__main__.py1019 except Exception as e:CODE
LOWtheHarvester/__main__.py1036 except Exception as e:CODE
LOWtheHarvester/__main__.py1053 except Exception as e:CODE
LOWtheHarvester/__main__.py1121 except Exception as e:CODE
LOWtheHarvester/__main__.py1141 except Exception as e:CODE
LOWtheHarvester/__main__.py1149 except Exception as e:CODE
LOWtheHarvester/__main__.py1160 except Exception as e:CODE
LOWtheHarvester/__main__.py1174 except Exception as e:CODE
LOWtheHarvester/__main__.py1188 except Exception as e:CODE
LOWtheHarvester/__main__.py1218 except Exception as e:CODE
LOWtheHarvester/__main__.py1235 except Exception as e:CODE
LOWtheHarvester/__main__.py1246 except Exception as e:CODE
LOWtheHarvester/__main__.py1261 except Exception as e:CODE
LOWtheHarvester/__main__.py1268 except Exception as e:CODE
LOWtheHarvester/__main__.py1287 except Exception as e:CODE
LOWtheHarvester/__main__.py1313 except Exception as e:CODE
212 more matches not shown…
Hyper-Verbose Identifiers101 hits · 101 pts
SeverityFileLineSnippetContext
LOWtests/test_hackertarget_apikey.py9 async def test_do_search_with_apikey(self, monkeypatch):CODE
LOWtests/test_hackertarget_apikey.py28 async def test_do_search_without_apikey(self, monkeypatch):CODE
LOWtests/test_security.py15 def test_cors_does_not_allow_credentials_with_wildcard_origins(self):CODE
LOWtests/test_security.py44 def test_cors_restricts_http_methods(self):CODE
LOWtests/test_security.py78 def test_sanitize_for_xml_escapes_special_characters(self):CODE
LOWtests/test_security.py100 def test_sanitize_for_xml_prevents_xml_entity_injection(self):CODE
LOWtests/test_security.py117 def test_command_line_args_are_sanitized_in_xml_output(self):CODE
LOWtests/test_security.py149 def test_api_does_not_expose_traceback_in_error_responses(self, client):CODE
LOWtests/test_security.py165 def test_error_responses_do_not_leak_internal_paths(self, client):CODE
LOWtests/test_security.py190 def test_debug_mode_does_not_expose_sensitive_info(self, client, monkeypatch):CODE
LOWtests/test_security.py216 def test_additional_endpoints_fail_closed_without_configured_api_key(self, client, monkeypatch):CODE
LOWtests/test_security.py223 def test_additional_endpoints_reject_missing_or_invalid_api_key(self, client, monkeypatch):CODE
LOWtests/test_security.py232 def test_additional_endpoints_do_not_expose_internal_errors(self, client, monkeypatch):CODE
LOWtests/test_security.py257 def test_sanitize_filename_removes_path_components(self):CODE
LOWtests/test_security.py284 def test_sanitize_filename_removes_dangerous_characters(self):CODE
LOWtests/test_security.py311 def test_sanitize_filename_prevents_hidden_files(self):CODE
LOWtests/test_security.py324 def test_filename_sanitization_preserves_safe_filenames(self):CODE
LOWtests/test_security.py342 def test_path_traversal_in_file_operations(self):CODE
LOWtests/test_security.py367 def test_no_hardcoded_secrets_in_code(self):CODE
LOWtests/test_security.py404 def test_api_has_rate_limiting(self):CODE
LOWtests/test_security.py414 def test_sensitive_endpoints_require_validation(self):CODE
LOWtests/discovery/test_rocketreach.py29async def test_do_search_uses_people_data_endpoint_and_start_pagination(monkeypatch) -> None:CODE
LOWtests/discovery/test_rocketreach.py98async def test_do_search_stops_on_throttling_message(monkeypatch) -> None:CODE
LOWtests/discovery/test_dymosearch.py38 async def test_process_extracts_canonical_and_suggestion(self, monkeypatch):CODE
LOWtests/discovery/test_dymosearch.py82 async def test_process_handles_empty_payload(self, monkeypatch):CODE
LOWtests/discovery/test_dymosearch.py98 async def test_process_ignores_unrelated_suggestion(self, monkeypatch):CODE
LOWtests/discovery/test_dymosearch.py120 async def test_process_handles_non_dict_response(self, monkeypatch):CODE
LOWtests/discovery/test_dymosearch.py137 def test_module_exposes_class(self, monkeypatch):CODE
LOWtests/discovery/test_dymosearch.py142 def test_supportedengines_lists_dymo(self):CODE
LOWtests/discovery/test_censys.py38async def test_search_uses_documented_pagination_and_fields(monkeypatch) -> None:CODE
LOWtests/discovery/test_censys.py77async def test_search_respects_limit_across_page_data(monkeypatch) -> None:CODE
LOWtests/discovery/test_thc.py32 async def test_api_subdomains_download_endpoint_responds(self) -> None:CODE
LOWtests/discovery/test_thc.py146 async def test_search_nonexistent_domain(self) -> None:CODE
LOWtests/discovery/test_thc.py172 async def test_search_special_characters_domain(self) -> None:CODE
LOWtests/discovery/test_thc.py185 async def test_search_unicode_domain(self) -> None:CODE
LOWtests/discovery/test_thc.py198 async def test_search_subdomain_as_input(self) -> None:CODE
LOWtests/discovery/test_thc.py220 async def test_process_accepts_proxy_parameter(self) -> None:CODE
LOWtests/discovery/test_thc.py231 async def test_proxy_attribute_is_set(self) -> None:CODE
LOWtests/discovery/test_thc.py249 def test_init_creates_empty_results(self) -> None:CODE
LOWtests/discovery/test_thc.py255 def test_init_proxy_default_false(self) -> None:CODE
LOWtests/discovery/test_thc.py260 def test_init_has_rate_limit_settings(self) -> None:CODE
LOWtests/discovery/test_thc.py268 def test_class_has_required_methods(self) -> None:CODE
LOWtests/discovery/test_thc.py290 async def test_hostnames_are_strings(self) -> None:CODE
LOWtests/discovery/test_thc.py336 async def test_module_can_be_imported(self) -> None:CODE
LOWtests/discovery/test_thc.py43 async def test_api_subdomains_returns_text_format(self) -> None:CODE
LOWtests/discovery/test_thc.py55 async def test_api_cli_subdomain_endpoint(self) -> None:CODE
LOWtests/discovery/test_thc.py66 async def test_api_returns_rate_limit_headers(self) -> None:CODE
LOWtests/discovery/test_thc.py104 async def test_search_finds_subdomains(self) -> None:CODE
LOWtests/discovery/test_thc.py115 async def test_search_results_contain_target_domain(self) -> None:CODE
LOWtests/discovery/test_thc.py127 async def test_search_no_duplicates(self) -> None:CODE
LOWtests/discovery/test_thc.py302 async def test_hostnames_are_valid_format(self) -> None:CODE
LOWtests/discovery/test_thc.py316 async def test_hostnames_are_lowercase(self) -> None:CODE
LOWtests/discovery/test_thc.py348 async def test_compatible_with_store_function(self) -> None:CODE
LOWtests/discovery/test_githubcode_additions.py10 async def test_process_stops_after_max_retries(self, monkeypatch):CODE
LOWtests/discovery/test_githubcode_additions.py36 async def test_process_stops_on_error_result(self, monkeypatch):CODE
LOWtests/discovery/test_githubcode_additions.py59 async def test_process_breaks_on_same_page_pagination(self, monkeypatch):CODE
LOWtests/discovery/test_baidusearch.py50 async def test_pagination_limit_exclusive(self, monkeypatch):CODE
LOWtests/discovery/test_githubcode.py63 async def test_fragments_from_response(self):CODE
LOWtests/discovery/test_githubcode.py73 async def test_invalid_fragments_from_response(self):CODE
LOWtests/discovery/test_githubcode.py96 async def test_infinite_loop_fix_page_zero(self):CODE
41 more matches not shown…
Decorative Section Separators14 hits · 60 pts
SeverityFileLineSnippetContext
MEDIUMtests/discovery/test_thc.py25# =============================================================================COMMENT
MEDIUMtests/discovery/test_thc.py27# =============================================================================COMMENT
MEDIUMtests/discovery/test_thc.py139# =============================================================================COMMENT
MEDIUMtests/discovery/test_thc.py141# =============================================================================COMMENT
MEDIUMtests/discovery/test_thc.py209# =============================================================================COMMENT
MEDIUMtests/discovery/test_thc.py211# =============================================================================COMMENT
MEDIUMtests/discovery/test_thc.py237# =============================================================================COMMENT
MEDIUMtests/discovery/test_thc.py239# =============================================================================COMMENT
MEDIUMtests/discovery/test_thc.py279# =============================================================================COMMENT
MEDIUMtests/discovery/test_thc.py281# =============================================================================COMMENT
MEDIUMtests/discovery/test_thc.py328# =============================================================================COMMENT
MEDIUMtests/discovery/test_thc.py330# =============================================================================COMMENT
MEDIUMtests/discovery/test_thc.py78# =============================================================================COMMENT
MEDIUMtests/discovery/test_thc.py80# =============================================================================COMMENT
Deep Nesting42 hits · 40 pts
SeverityFileLineSnippetContext
LOWtheHarvester/__main__.py111CODE
LOWtheHarvester/parsers/venacusparser.py38CODE
LOWtheHarvester/parsers/securitytrailsparser.py11CODE
LOWtheHarvester/parsers/intelxparser.py6CODE
LOWtheHarvester/discovery/fofa.py50CODE
LOWtheHarvester/discovery/rocketreach.py21CODE
LOWtheHarvester/discovery/bitbucket.py109CODE
LOWtheHarvester/discovery/certspottersearch.py10CODE
LOWtheHarvester/discovery/search_dnsdumpster.py16CODE
LOWtheHarvester/discovery/censysearch.py36CODE
LOWtheHarvester/discovery/duckduckgosearch.py32CODE
LOWtheHarvester/discovery/leaklookup.py20CODE
LOWtheHarvester/discovery/mojeek.py24CODE
LOWtheHarvester/discovery/thc.py18CODE
LOWtheHarvester/discovery/hudsonrocksearch.py209CODE
LOWtheHarvester/discovery/hudsonrocksearch.py302CODE
LOWtheHarvester/discovery/rapiddns.py13CODE
LOWtheHarvester/discovery/zoomeyesearch.py260CODE
LOWtheHarvester/discovery/githubcode.py113CODE
LOWtheHarvester/discovery/chaos.py47CODE
LOWtheHarvester/discovery/builtwith.py46CODE
LOWtheHarvester/discovery/criminalip.py186CODE
LOWtheHarvester/discovery/robtex.py44CODE
LOWtheHarvester/discovery/onyphe.py35CODE
LOWtheHarvester/discovery/waybackarchive.py31CODE
LOWtheHarvester/discovery/leakix.py42CODE
LOWtheHarvester/discovery/bravesearch.py22CODE
LOWtheHarvester/discovery/api_endpoints.py477CODE
LOWtheHarvester/discovery/api_endpoints.py539CODE
LOWtheHarvester/discovery/threatcrowd.py38CODE
LOWtheHarvester/discovery/additional_apis.py110CODE
LOWtheHarvester/discovery/commoncrawl.py58CODE
LOWtheHarvester/discovery/search_dehashed.py26CODE
LOWtheHarvester/discovery/gitlabsearch.py75CODE
LOWtheHarvester/discovery/gitlabsearch.py136CODE
LOWtheHarvester/discovery/windvane.py85CODE
LOWtheHarvester/discovery/windvane.py125CODE
LOWtheHarvester/discovery/windvane.py169CODE
LOWtheHarvester/discovery/windvane.py202CODE
LOWtheHarvester/discovery/windvane.py244CODE
LOWtheHarvester/discovery/shodansearch.py18CODE
LOWtheHarvester/lib/stash.py170CODE
Redundant / Tautological Comments9 hits · 14 pts
SeverityFileLineSnippetContext
LOWtheHarvester/__main__.py1532 # Check if Rest API is being used if so return found hostsCOMMENT
LOWtheHarvester/__main__.py1657 # Check if the result is a string (error message)COMMENT
LOWtheHarvester/__main__.py1818 # Print resultsCOMMENT
LOWtheHarvester/discovery/waybackarchive.py59 # Check if it's a subdomain of our targetCOMMENT
LOWtheHarvester/discovery/leakix.py66 # Check if the response is an error messageCOMMENT
LOWtheHarvester/discovery/api_endpoints.py606 # Check if rate limitedCOMMENT
LOWtheHarvester/discovery/api_endpoints.py615 # Check if this is an interesting endpointCOMMENT
LOWtheHarvester/discovery/commoncrawl.py92 # Check if it's a subdomain of our targetCOMMENT
LOWtheHarvester/discovery/windvane.py99 # Check if response is successfulCOMMENT
AI Slop Vocabulary6 hits · 14 pts
SeverityFileLineSnippetContext
MEDIUMtheHarvester/discovery/fullhuntsearch.py216 """Get comprehensive details about a domain"""STRING
MEDIUMtheHarvester/discovery/constants.py93 # That means we will try out second option which will utilize proxiesCOMMENT
MEDIUMtheHarvester/discovery/securitytrailssearch.py19 # Hold structured responses for robust parsingCOMMENT
MEDIUMtheHarvester/discovery/securitytrailssearch.py38 # Request JSON payloads for robust parsingCOMMENT
MEDIUMtheHarvester/discovery/api_endpoints.py106 # Add comprehensive API paths categorized by functionalityCOMMENT
MEDIUMtheHarvester/discovery/api_endpoints.py725 """Get a comprehensive summary of scan results.STRING
Unused Imports9 hits · 9 pts
SeverityFileLineSnippetContext
LOWtests/test_security.py4CODE
LOWtests/discovery/test_certspotter.py10CODE
LOWtests/discovery/test_otx.py9CODE
LOWtests/lib/test_core.py1CODE
LOWtests/lib/test_output.py1CODE
LOWtheHarvester/lib/hostchecker.py7CODE
LOWtheHarvester/lib/core.py1CODE
LOWtheHarvester/lib/output.py1CODE
LOWtheHarvester/lib/api/api.py7CODE
Fake / Example Data8 hits · 9 pts
SeverityFileLineSnippetContext
LOWtests/discovery/test_censys.py52 {'names': ['a.example.com'], 'parsed': {'subject': {'email_address': 'admin@example.com'}}},CODE
LOWtests/discovery/test_censys.py73 assert await search.get_emails() == {'admin@example.com', 'ops@example.com'}CODE
LOWtests/discovery/test_builtwith.py33 monkeypatch.setattr(builtwith.Core, 'builtwith_key', lambda: 'dummy-key')CODE
LOWtests/discovery/test_builtwith.py92 monkeypatch.setattr(builtwith.Core, 'builtwith_key', lambda: 'dummy-key')CODE
LOWtests/discovery/test_sherlockeye.py31 monkeypatch.setattr(sherlockeye.Core, 'sherlockeye_key', lambda: 'dummy-key')CODE
LOWtests/discovery/test_sherlockeye.py48 'email': 'user@example.com',CODE
LOWtests/discovery/test_sherlockeye.py97 assert await search.get_emails() == {'user@example.com'}CODE
LOWtests/discovery/test_sherlockeye.py103 monkeypatch.setattr(sherlockeye.Core, 'sherlockeye_key', lambda: 'dummy-key')CODE
Self-Referential Comments2 hits · 6 pts
SeverityFileLineSnippetContext
MEDIUMtheHarvester/__main__.py1780 # Define a default wordlist if none is specifiedCOMMENT
MEDIUMtheHarvester/__main__.py1786 # Create a default simple API endpoint listCOMMENT
AI Structural Patterns4 hits · 4 pts
SeverityFileLineSnippetContext
LOWtheHarvester/__main__.py321CODE
LOWtheHarvester/discovery/api_endpoints.py52CODE
LOWtheHarvester/lib/core.py580CODE
LOWtheHarvester/lib/api/api.py288CODE
Modern Structural Boilerplate3 hits · 4 pts
SeverityFileLineSnippetContext
LOWtheHarvester/discovery/windvane.py306 def set_api_key(self, api_key: str) -> None:CODE
LOWtheHarvester/lib/__init__.py1__all__ = ['hostchecker']CODE
LOWtheHarvester/lib/api/additional_endpoints.py11logger = logging.getLogger(__name__)CODE
Over-Commented Block3 hits · 3 pts
SeverityFileLineSnippetContext
LOWtheHarvester/lib/hostchecker.py21 self.hosts: list[str] = hostsCOMMENT
LOW.github/workflows/codeql-analysis.yml1# For most projects, this workflow file will not need changing; you simply needCOMMENT
LOW.github/workflows/codeql-analysis.yml61 # Prefix the list here with "+" to use these queries and those in the config file.COMMENT