Repository Analysis

CloakHQ/CloakBrowser

Stealth Chromium that passes every bot detection test. Drop-in Playwright replacement with source-level fingerprint patches. 30/30 tests passed.

41.2 Strong AI signal View on GitHub
41.2
Adjusted Score
41.2
Raw Score
100%
Time Factor
2026-05-26
Last Push
22,609
Stars
Python
Language
34,761
Lines of Code
104
Files
821
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 0HIGH 42MEDIUM 223LOW 556

Pattern Findings

821 matches across 13 categories. Click a row to expand file-level details.

Decorative Section Separators216 hits · 682 pts
SeverityFileLineSnippet
MEDIUMtests/test_geoip.py16# ---------------------------------------------------------------------------
MEDIUMtests/test_geoip.py18# ---------------------------------------------------------------------------
MEDIUMtests/test_geoip.py49# ---------------------------------------------------------------------------
MEDIUMtests/test_geoip.py51# ---------------------------------------------------------------------------
MEDIUMtests/test_geoip.py68# ---------------------------------------------------------------------------
MEDIUMtests/test_geoip.py70# ---------------------------------------------------------------------------
MEDIUMtests/test_geoip.py95# ---------------------------------------------------------------------------
MEDIUMtests/test_geoip.py97# ---------------------------------------------------------------------------
MEDIUMtests/test_geoip.py162# ---------------------------------------------------------------------------
MEDIUMtests/test_geoip.py164# ---------------------------------------------------------------------------
MEDIUMtests/test_persistent_context.py23# ---------------------------------------------------------------------------
MEDIUMtests/test_persistent_context.py25# ---------------------------------------------------------------------------
MEDIUMtests/test_persistent_context.py200# ---------------------------------------------------------------------------
MEDIUMtests/test_persistent_context.py202# ---------------------------------------------------------------------------
MEDIUMtests/test_humanize_unit.py39# =========================================================================
MEDIUMtests/test_humanize_unit.py41# =========================================================================
MEDIUMtests/test_humanize_unit.py49# =========================================================================
MEDIUMtests/test_humanize_unit.py51# =========================================================================
MEDIUMtests/test_humanize_unit.py66# =========================================================================
MEDIUMtests/test_humanize_unit.py68# =========================================================================
MEDIUMtests/test_humanize_unit.py117# =========================================================================
MEDIUMtests/test_humanize_unit.py119# =========================================================================
MEDIUMtests/test_humanize_unit.py188# =========================================================================
MEDIUMtests/test_humanize_unit.py190# =========================================================================
MEDIUMtests/test_humanize_unit.py269# =========================================================================
MEDIUMtests/test_humanize_unit.py271# =========================================================================
MEDIUMtests/test_humanize_unit.py311# =========================================================================
MEDIUMtests/test_humanize_unit.py313# =========================================================================
MEDIUMtests/test_humanize_unit.py398# =========================================================================
MEDIUMtests/test_humanize_unit.py400# =========================================================================
MEDIUMtests/test_humanize_unit.py429# =========================================================================
MEDIUMtests/test_humanize_unit.py431# =========================================================================
MEDIUMtests/test_humanize_unit.py445# =========================================================================
MEDIUMtests/test_humanize_unit.py447# =========================================================================
MEDIUMtests/test_humanize_unit.py464# =========================================================================
MEDIUMtests/test_humanize_unit.py466# =========================================================================
MEDIUMtests/test_humanize_unit.py482# =========================================================================
MEDIUMtests/test_humanize_unit.py484# =========================================================================
MEDIUMtests/test_humanize_unit.py603# =========================================================================
MEDIUMtests/test_humanize_unit.py605# =========================================================================
MEDIUMtests/test_humanize_unit.py761# =========================================================================
MEDIUMtests/test_humanize_unit.py763# =========================================================================
MEDIUMtests/test_humanize_unit.py1165# =========================================================================
MEDIUMtests/test_humanize_unit.py1167# =========================================================================
MEDIUMtests/test_humanize_unit.py1256# =========================================================================
MEDIUMtests/test_humanize_unit.py1258# =========================================================================
MEDIUMtests/test_humanize_unit.py1374# =========================================================================
MEDIUMtests/test_humanize_unit.py1376# =========================================================================
MEDIUMtests/test_humanize_unit.py1477# =========================================================================
MEDIUMtests/test_humanize_unit.py1479# =========================================================================
MEDIUMtests/test_humanize_unit.py1668# =========================================================================
MEDIUMtests/test_humanize_unit.py1670# =========================================================================
MEDIUMtests/test_humanize_unit.py1831# =========================================================================
MEDIUMtests/test_humanize_unit.py1833# =========================================================================
MEDIUMtests/test_humanize_unit.py371# =========================================================================
MEDIUMtests/test_humanize_unit.py373# =========================================================================
MEDIUMtests/test_humanize_unit.py1943# =========================================================================
MEDIUMtests/test_humanize_unit.py1945# =========================================================================
MEDIUMtests/test_cloakserve.py85# ---------------------------------------------------------------------------
MEDIUMtests/test_cloakserve.py87# ---------------------------------------------------------------------------
156 more matches not shown…
Hyper-Verbose Identifiers369 hits · 328 pts
SeverityFileLineSnippet
LOWjs/src/download.ts540export function resetWrapperUpdateChecked(): void {
LOWjs/src/proxy.ts76function lenientDecodeURIComponent(s: string): string {
LOWjs/src/proxy.ts163export function supportsHttpProxyInlineAuth(): boolean {
LOWtests/test_backend.py11def test_resolve_backend_default():
LOWtests/test_backend.py17def test_resolve_backend_explicit_playwright():
LOWtests/test_backend.py21def test_resolve_backend_explicit_patchright():
LOWtests/test_backend.py25def test_resolve_backend_env_var():
LOWtests/test_backend.py31def test_resolve_backend_param_beats_env():
LOWtests/test_backend.py37def test_resolve_backend_invalid_raises():
LOWtests/test_backend.py42def test_resolve_backend_invalid_env_raises():
LOWtests/test_geoip.py54def test_locale_map_has_common_countries():
LOWtests/test_geoip.py85def test_resolve_geo_returns_none_when_db_missing():
LOWtests/test_geoip.py100def test_maybe_resolve_skips_when_geoip_false():
LOWtests/test_geoip.py107def test_maybe_resolve_skips_when_no_proxy():
LOWtests/test_geoip.py114def test_maybe_resolve_skips_when_both_explicit():
LOWtests/test_geoip.py123def test_maybe_resolve_fills_missing_timezone():
LOWtests/test_geoip.py131def test_maybe_resolve_fills_missing_locale():
LOWtests/test_geoip.py139def test_maybe_resolve_fills_both():
LOWtests/test_geoip.py148def test_maybe_resolve_geoip_timeout_returns_existing_values(monkeypatch):
LOWtests/test_launch.py34def test_launch_with_extra_args():
LOWtests/test_launch.py53def test_chrome_object_exists():
LOWtests/test_persistent_context.py13def _make_mock_pw_and_context():
LOWtests/test_persistent_context.py30def test_persistent_context_args_built(_mock_geoip, _mock_bin):
LOWtests/test_persistent_context.py46def test_persistent_context_default_viewport(_mock_geoip, _mock_bin):
LOWtests/test_persistent_context.py60def test_persistent_context_custom_viewport(_mock_geoip, _mock_bin):
LOWtests/test_persistent_context.py75def test_persistent_context_user_agent(_mock_geoip, _mock_bin):
LOWtests/test_persistent_context.py88def test_persistent_context_locale_and_timezone(_mock_bin):
LOWtests/test_persistent_context.py107def test_persistent_context_color_scheme(_mock_geoip, _mock_bin):
LOWtests/test_persistent_context.py121def test_persistent_context_geoip(_mock_bin, _mock_geoip):
LOWtests/test_persistent_context.py139def test_persistent_context_timezone_id_alias(_mock_bin):
LOWtests/test_persistent_context.py154def test_persistent_context_close_stops_pw(_mock_geoip, _mock_bin):
LOWtests/test_persistent_context.py171def test_persistent_context_proxy_string(_mock_geoip, _mock_bin, _mock_platform):
LOWtests/test_persistent_context.py187def test_persistent_context_proxy_dict(_mock_geoip, _mock_bin):
LOWtests/test_persistent_context.py205def _make_mock_async_pw_and_context():
LOWtests/test_persistent_context.py218async def test_persistent_context_async_args_built(_mock_geoip, _mock_bin):
LOWtests/test_persistent_context.py234async def test_persistent_context_async_close_stops_pw(_mock_geoip, _mock_bin):
LOWtests/test_persistent_context.py250async def test_persistent_context_async_timezone_id_alias(_mock_bin):
LOWtests/test_humanize_unit.py71 def test_default_config_resolves(self):
LOWtests/test_humanize_unit.py81 def test_careful_config_resolves(self):
LOWtests/test_humanize_unit.py122 def test_generates_multiple_points(self):
LOWtests/test_humanize_unit.py193 def test_async_modules_import(self):
LOWtests/test_humanize_unit.py274 def test_press_skips_click_when_focused(self):
LOWtests/test_humanize_unit.py316 def test_check_calls_idle_when_enabled(self):
LOWtests/test_humanize_unit.py403 def test_handles_missing_original(self):
LOWtests/test_humanize_unit.py434 def test_resolve_config_has_all_fields(self):
LOWtests/test_humanize_unit.py450 def test_default_mistype_chance(self):
LOWtests/test_humanize_unit.py457 def test_careful_mistype_higher(self):
LOWtests/test_humanize_unit.py469 def test_select_all_constant_exists(self):
LOWtests/test_humanize_unit.py473 def test_select_all_matches_platform(self):
LOWtests/test_humanize_unit.py487 def test_cyrillic_uses_insert_text(self):
LOWtests/test_humanize_unit.py609 def test_fill_clears_existing(self):
LOWtests/test_humanize_unit.py768 def test_patch_single_element_handle_marks_patched(self):
LOWtests/test_humanize_unit.py1171 async def test_async_element_handle_click(self):
LOWtests/test_humanize_unit.py1262 def test_query_selector_click_humanized(self):
LOWtests/test_humanize_unit.py1382 def test_get_element_box_default_timeout(self):
LOWtests/test_humanize_unit.py1486 def test_merge_config_creates_new_instance(self):
LOWtests/test_humanize_unit.py1497 def test_merge_config_none_returns_base(self):
LOWtests/test_humanize_unit.py1504 def test_merge_config_ignores_unknown_keys(self):
LOWtests/test_humanize_unit.py1513 def test_page_type_uses_per_call_typing_delay(self):
LOWtests/test_humanize_unit.py1677 def test_human_scroll_into_view_skips_when_in_viewport(self):
309 more matches not shown…
Cross-Language Confusion41 hits · 241 pts
SeverityFileLineSnippet
HIGHtests/test_launch.py54 """window.chrome should exist (Playwright leaks undefined)."""
HIGHtests/test_stealth_reproduction_110.py37 window.__detections.evaluateQS.push(sel);
HIGHtests/test_stealth_reproduction_110.py46 window.__detections.untrustedKeydown.push(e.key);
HIGHtests/test_stealth_reproduction_110.py146 window.__evalLeaks.push(sel);
HIGHtests/test_stealth_unit.py1365 if (e.stack && e.stack.includes(':302:')) {
HIGHtests/test_stealth_unit.py1366 window.__evalLeaks.push(sel);
HIGHtests/test_stealth_unit.py1375 window.__untrustedKeys.push(e.key);
HIGHtests/test_stealth_unit.py1200 if (e.stack && e.stack.includes(':302:')) {
HIGHtests/test_stealth_unit.py1201 window.__evaluateDetections.push(sel);
HIGHtests/test_stealth_unit.py1244 window.__untrustedKeys.push(e.key);
HIGHtests/test_stealth_unit.py1246 window.__trustedKeys.push(e.key);
HIGHtests/test_stealth_unit.py1319 if (e.stack && e.stack.includes(':302:')) {
HIGHtests/test_stealth_unit.py1320 window.__evalLeaks.push({sel, stack: e.stack.substring(0, 200)});
HIGHtests/test_stealth_unit.py1427 if (e.stack && e.stack.includes(':302:')) {
HIGHtests/test_stealth_unit.py1428 window.__evalLeaks.push(sel);
HIGHtests/test_stealth_unit.py1463 if (!e.isTrusted) window.__untrusted.push(e.key);
HIGHtests/test_stealth.py48 """window.chrome must be an object (not undefined)."""
HIGHtests/test_stealth.py105 failed.push(cells[0].innerText.trim());
HIGHtests/test_stealth.py166 const isBot = botMatch ? botMatch[1] === 'true' : null;
HIGHtests/test_stealth.py214 return {score: scoreMatch ? parseFloat(scoreMatch[1]) : null};
HIGHcloakbrowser/human/__init__.py1151 || node.getAttribute && node.getAttribute('contenteditable') === 'true';
HIGHcloakbrowser/human/__init__.py2071 || node.getAttribute && node.getAttribute('contenteditable') === 'true';
HIGHexamples/fingerprint_scan_test.py46 downlinkMax: navigator.connection?.downlinkMax ?? null,
HIGHexamples/fingerprint_scan_test.py105 likeHeadlessPct: likeMatch ? parseInt(likeMatch[1]) : null,
HIGHexamples/fingerprint_scan_test.py106 headlessPct: headlessMatch ? parseInt(headlessMatch[1]) : null,
HIGHexamples/fingerprint_scan_test.py107 stealthPct: stealthMatch ? parseInt(stealthMatch[1]) : null,
HIGHexamples/fingerprint_scan_test.py120 if (!fp || !fp.headless) return null;
HIGHexamples/fingerprint_scan_test.py122 likeHeadless: fp.headless.likeHeadless || null,
HIGHexamples/fingerprint_scan_test.py122 likeHeadless: fp.headless.likeHeadless || null,
HIGHexamples/fingerprint_scan_test.py123 headless: fp.headless.headless || null,
HIGHexamples/fingerprint_scan_test.py123 headless: fp.headless.headless || null,
HIGHexamples/fingerprint_scan_test.py124 stealth: fp.headless.stealth || null,
HIGHexamples/fingerprint_scan_test.py124 stealth: fp.headless.stealth || null,
HIGHexamples/fingerprint_scan_test.py126 } catch { return null; }
HIGHexamples/fingerprint_scan_test.py159 if (!fp || !fp.platformEstimate) return null;
HIGHexamples/fingerprint_scan_test.py161 } catch { return null; }
HIGHexamples/stealth_test.py110 const isBot = botMatch ? botMatch[1] === 'true' : null;
HIGHexamples/stealth_test.py161 return match ? parseFloat(match[1]) : null;
HIGHexamples/stealth_test.py239 let fullVersion = null;
HIGHexamples/stealth_test.py243 fullVersion = chrome ? chrome.version : null;
HIGHexamples/stealth_test.py246 const dbg = gl ? gl.getExtension('WEBGL_debug_renderer_info') : null;
Excessive Try-Catch Wrapping89 hits · 77 pts
SeverityFileLineSnippet
LOWtests/test_humanize_unit.py1882 except Exception:
LOWtests/test_stealth_unit.py1021 except Exception:
LOWtests/test_stealth.py188 except Exception:
LOWtests/test_stealth.py279 except Exception as e:
LOWcloakbrowser/download.py156 except Exception as primary_err:
LOWcloakbrowser/download.py208 except Exception:
LOWcloakbrowser/download.py388 except Exception:
LOWcloakbrowser/download.py485 except Exception:
LOWcloakbrowser/download.py528 except Exception:
LOWcloakbrowser/download.py563 except Exception:
LOWcloakbrowser/browser.py575 except Exception:
LOWcloakbrowser/browser.py952 except Exception:
LOWcloakbrowser/geoip.py107 except Exception as exc:
LOWcloakbrowser/geoip.py143 except Exception as exc:
LOWcloakbrowser/geoip.py233 except Exception:
LOWcloakbrowser/geoip.py261 except Exception as exc:
LOWcloakbrowser/geoip.py295 except Exception:
LOWcloakbrowser/geoip.py312 except Exception:
MEDIUMcloakbrowser/geoip.py309def _bg() -> None:
LOWcloakbrowser/__main__.py105 except Exception as e:
MEDIUMcloakbrowser/__main__.py106 print(f"Error: {e}", file=sys.stderr)
LOWcloakbrowser/human/scroll_async.py27 except Exception:
LOWcloakbrowser/human/scroll.py30 except Exception:
LOWcloakbrowser/human/__init__.py338 except Exception:
LOWcloakbrowser/human/__init__.py1132 except Exception:
LOWcloakbrowser/human/__init__.py1154 except Exception:
LOWcloakbrowser/human/__init__.py1360 except Exception:
LOWcloakbrowser/human/__init__.py1369 except Exception:
LOWcloakbrowser/human/__init__.py2074 except Exception:
LOWcloakbrowser/human/__init__.py110 except Exception:
LOWcloakbrowser/human/__init__.py115 except Exception:
LOWcloakbrowser/human/__init__.py178 except Exception:
LOWcloakbrowser/human/__init__.py183 except Exception:
LOWcloakbrowser/human/__init__.py231 except Exception:
LOWcloakbrowser/human/__init__.py246 except Exception:
LOWcloakbrowser/human/__init__.py266 except Exception:
LOWcloakbrowser/human/__init__.py280 except Exception:
LOWcloakbrowser/human/__init__.py298 except Exception:
LOWcloakbrowser/human/__init__.py309 except Exception:
LOWcloakbrowser/human/__init__.py327 except Exception:
LOWcloakbrowser/human/__init__.py444 except Exception:
LOWcloakbrowser/human/__init__.py682 except Exception:
LOWcloakbrowser/human/__init__.py860 except Exception:
LOWcloakbrowser/human/__init__.py1039 except Exception:
LOWcloakbrowser/human/__init__.py1056 except Exception:
LOWcloakbrowser/human/__init__.py1237 except Exception:
LOWcloakbrowser/human/__init__.py1409 except Exception:
LOWcloakbrowser/human/__init__.py1430 except Exception:
LOWcloakbrowser/human/__init__.py1452 except Exception:
LOWcloakbrowser/human/__init__.py1558 except Exception:
LOWcloakbrowser/human/__init__.py1614 except Exception:
LOWcloakbrowser/human/__init__.py1649 except Exception:
LOWcloakbrowser/human/__init__.py1702 except Exception:
LOWcloakbrowser/human/__init__.py1788 except Exception:
LOWcloakbrowser/human/__init__.py1966 except Exception:
LOWcloakbrowser/human/__init__.py1983 except Exception:
LOWcloakbrowser/human/__init__.py2157 except Exception:
LOWcloakbrowser/human/__init__.py2179 except Exception:
LOWcloakbrowser/human/__init__.py2286 except Exception:
LOWcloakbrowser/human/__init__.py2298 except Exception:
29 more matches not shown…
Unused Imports71 hits · 60 pts
SeverityFileLineSnippet
LOWtests/conftest.py3
LOWtests/test_humanize_unit.py194
LOWtests/test_humanize_unit.py195
LOWtests/test_humanize_unit.py197
LOWtests/test_humanize_unit.py197
LOWtests/test_humanize_unit.py926
LOWtests/test_stealth_unit.py17
LOWtests/test_stealth_unit.py19
LOWtests/test_stealth_unit.py22
LOWtests/test_launch_context.py3
LOWtests/test_update.py3
LOWtests/test_update.py7
LOWtests/test_update.py12
LOWtests/test_extract.py4
LOWtests/test_extract.py6
LOWtests/test_lambda_security.py3
LOWtests/test_lambda_security.py7
LOWcloakbrowser/config.py3
LOWcloakbrowser/config.py10
LOWcloakbrowser/download.py7
LOWcloakbrowser/__init__.py14
LOWcloakbrowser/__init__.py14
LOWcloakbrowser/__init__.py14
LOWcloakbrowser/__init__.py14
LOWcloakbrowser/__init__.py14
LOWcloakbrowser/__init__.py14
LOWcloakbrowser/__init__.py14
LOWcloakbrowser/__init__.py14
LOWcloakbrowser/__init__.py14
LOWcloakbrowser/__init__.py15
LOWcloakbrowser/__init__.py15
LOWcloakbrowser/__init__.py16
LOWcloakbrowser/__init__.py16
LOWcloakbrowser/__init__.py16
LOWcloakbrowser/__init__.py16
LOWcloakbrowser/__init__.py17
LOWcloakbrowser/browser.py15
LOWcloakbrowser/geoip.py11
LOWcloakbrowser/__main__.py10
LOWcloakbrowser/human/scroll_async.py7
LOWcloakbrowser/human/config.py7
LOWcloakbrowser/human/config.py9
LOWcloakbrowser/human/config.py12
LOWcloakbrowser/human/keyboard_async.py10
LOWcloakbrowser/human/keyboard_async.py13
LOWcloakbrowser/human/keyboard_async.py15
LOWcloakbrowser/human/keyboard_async.py16
LOWcloakbrowser/human/scroll.py3
LOWcloakbrowser/human/mouse_async.py7
LOWcloakbrowser/human/mouse_async.py11
LOWcloakbrowser/human/mouse_async.py14
LOWcloakbrowser/human/__init__.py14
LOWcloakbrowser/human/__init__.py22
LOWcloakbrowser/human/__init__.py22
LOWcloakbrowser/human/__init__.py30
LOWcloakbrowser/human/__init__.py30
LOWcloakbrowser/human/__init__.py30
LOWcloakbrowser/human/__init__.py30
LOWcloakbrowser/human/__init__.py30
LOWcloakbrowser/human/__init__.py30
11 more matches not shown…
Deep Nesting16 hits · 12 pts
SeverityFileLineSnippet
LOWtests/test_update.py450
LOWtests/test_lambda_security.py131
LOWcloakbrowser/config.py159
LOWcloakbrowser/download.py246
LOWcloakbrowser/download.py313
LOWcloakbrowser/download.py466
LOWcloakbrowser/geoip.py266
LOWcloakbrowser/human/__init__.py1533
LOWcloakbrowser/human/__init__.py2462
LOWcloakbrowser/human/__init__.py92
LOWcloakbrowser/human/__init__.py160
LOWcloakbrowser/human/actionability.py86
LOWcloakbrowser/human/actionability.py270
LOWcloakbrowser/human/actionability_async.py39
LOWcloakbrowser/human/actionability_async.py171
LOWexamples/fingerprint_scan_test.py89
Verbosity Indicators5 hits · 10 pts
SeverityFileLineSnippet
LOWexamples/integrations/browser_use_example.py18 # Step 1: Launch CloakBrowser (handles binary, stealth args, fingerprints)
LOWexamples/integrations/browser_use_example.py24 # Step 2: Connect browser-use to the stealth browser via CDP
LOWexamples/integrations/browser_use_example.py27 # Step 3: Run your AI agent — it browses through CloakBrowser
LOWexamples/integrations/crawl4ai_example.py17 # Step 1: Launch CloakBrowser with remote debugging
LOWexamples/integrations/crawl4ai_example.py23 # Step 2: Connect Crawl4AI to the stealth browser via CDP
Self-Referential Comments2 hits · 8 pts
SeverityFileLineSnippet
MEDIUMtests/test_update.py407 # Create the binary dir so it looks already downloaded
MEDIUMtests/test_update.py438 # Create a fake cached binary
Docstring Block Structure1 hit · 5 pts
SeverityFileLineSnippet
HIGHcloakbrowser/human/config.py179Resolve a preset name + optional overrides into a full HumanConfig. Args: preset: 'default' or 'careful'.
Fake / Example Data4 hits · 4 pts
SeverityFileLineSnippet
LOWREADME.md528page.locator("#email").fill("user@example.com") # per-character timing, thinking pauses
LOWREADME.md1220 page.type("#email", "user@example.com", delay=50)
LOWjs/README.md277 await page.type('#email', 'user@example.com', { delay: 50 });
LOWjs/src/puppeteer.ts113 * await page.type('#email', 'user@example.com'); // Per-character timing
Over-Commented Block4 hits · 4 pts
SeverityFileLineSnippet
LOWbin/docker-entrypoint.sh1#!/bin/bash
LOWjs/src/human/elementhandle.ts141
LOWexamples/integrations/agent_browser.sh1#!/bin/bash
LOWexamples/integrations/aws_lambda/lambda-entrypoint.sh1#!/bin/sh
AI Slop Vocabulary2 hits · 2 pts
SeverityFileLineSnippet
MEDIUMexamples/fingerprint_scan_test.py90 """abrahamjuliot.github.io/creepjs — comprehensive fingerprint analysis."""
MEDIUMexamples/stealth_test.py54 """bot.incolumitas.com — comprehensive 30+ check bot detection."""
Redundant / Tautological Comments1 hit · 0 pts
SeverityFileLineSnippet
LOWtests/test_stealth_unit.py1214 # Check if any querySelector calls came from evaluate context