🖥️ Run AI Agent in your browser.
This report summarizes scanner evidence for browser-use/web-ui, a Python project with 16,611 GitHub stars. SynthScan examined 5,894 lines of code across 34 source files, recording 195 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 35.1 (High 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? 53 finding(s).
Are imports declared and package/API names verified? 92 finding(s).
Are wrappers, guards, and repeated structures necessary? 59 finding(s).
Which changes need focused human review? 195 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 195 distinct pattern matches across 10 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 | tests/test_agents.py | 14 | CODE | |
| LOW | tests/test_agents.py | 17 | CODE | |
| LOW | tests/test_agents.py | 21 | CODE | |
| LOW | tests/test_agents.py | 25 | CODE | |
| LOW | tests/test_agents.py | 167 | CODE | |
| LOW | tests/test_agents.py | 171 | CODE | |
| LOW | tests/test_agents.py | 330 | CODE | |
| LOW | tests/test_agents.py | 330 | CODE | |
| LOW | tests/test_playwright.py | 1 | CODE | |
| LOW | tests/test_controller.py | 56 | CODE | |
| LOW | tests/test_controller.py | 58 | CODE | |
| LOW | src/utils/utils.py | 6 | CODE | |
| LOW | src/utils/utils.py | 7 | CODE | |
| LOW | src/utils/utils.py | 8 | CODE | |
| LOW | src/utils/utils.py | 9 | CODE | |
| LOW | src/utils/llm_provider.py | 2 | CODE | |
| LOW | src/utils/llm_provider.py | 4 | CODE | |
| LOW | src/utils/llm_provider.py | 5 | CODE | |
| LOW | src/utils/llm_provider.py | 5 | CODE | |
| LOW | src/utils/llm_provider.py | 11 | CODE | |
| LOW | src/utils/llm_provider.py | 11 | CODE | |
| LOW | src/utils/llm_provider.py | 12 | CODE | |
| LOW | src/utils/llm_provider.py | 12 | CODE | |
| LOW | src/utils/llm_provider.py | 12 | CODE | |
| LOW | src/utils/llm_provider.py | 12 | CODE | |
| LOW | src/utils/llm_provider.py | 12 | CODE | |
| LOW | src/utils/llm_provider.py | 12 | CODE | |
| LOW | src/utils/llm_provider.py | 22 | CODE | |
| LOW | src/utils/llm_provider.py | 22 | CODE | |
| LOW | src/utils/llm_provider.py | 22 | CODE | |
| LOW | src/utils/llm_provider.py | 22 | CODE | |
| LOW | src/utils/llm_provider.py | 22 | CODE | |
| LOW | src/utils/llm_provider.py | 30 | CODE | |
| LOW | src/utils/llm_provider.py | 31 | CODE | |
| LOW | src/utils/llm_provider.py | 32 | CODE | |
| LOW | src/utils/llm_provider.py | 34 | CODE | |
| LOW | src/utils/llm_provider.py | 34 | CODE | |
| LOW | src/utils/llm_provider.py | 34 | CODE | |
| LOW | src/utils/llm_provider.py | 34 | CODE | |
| LOW | src/utils/llm_provider.py | 34 | CODE | |
| LOW | src/utils/llm_provider.py | 34 | CODE | |
| LOW | src/utils/llm_provider.py | 49 | CODE | |
| LOW | src/utils/llm_provider.py | 50 | CODE | |
| LOW | src/agent/browser_use/browser_use_agent.py | 1 | CODE | |
| LOW | src/controller/custom_controller.py | 1 | CODE | |
| LOW | src/controller/custom_controller.py | 3 | CODE | |
| LOW | src/controller/custom_controller.py | 8 | CODE | |
| LOW | src/controller/custom_controller.py | 9 | CODE | |
| LOW | src/controller/custom_controller.py | 10 | CODE | |
| LOW | src/controller/custom_controller.py | 11 | CODE | |
| LOW | src/controller/custom_controller.py | 11 | CODE | |
| LOW | src/controller/custom_controller.py | 11 | CODE | |
| LOW | src/controller/custom_controller.py | 11 | CODE | |
| LOW | src/controller/custom_controller.py | 11 | CODE | |
| LOW | src/controller/custom_controller.py | 11 | CODE | |
| LOW | src/controller/custom_controller.py | 11 | CODE | |
| LOW | src/controller/custom_controller.py | 11 | CODE | |
| LOW | src/controller/custom_controller.py | 11 | CODE | |
| LOW | src/controller/custom_controller.py | 11 | CODE | |
| LOW | src/controller/custom_controller.py | 25 | CODE | |
| 32 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_agents.py | 154 | except Exception: | CODE |
| LOW | tests/test_agents.py | 316 | except Exception: | CODE |
| LOW | tests/test_agents.py | 392 | except Exception as e: | CODE |
| LOW | src/utils/utils.py | 36 | except Exception as e: | CODE |
| MEDIUM | src/utils/utils.py | 37 | print(f"Error getting latest {file_type} file: {e}") | CODE |
| LOW | src/utils/mcp_client.py | 41 | except Exception as e: | CODE |
| LOW | src/utils/mcp_client.py | 107 | except Exception: | CODE |
| LOW | src/agent/browser_use/browser_use_agent.py | 158 | except Exception as script_gen_err: | CODE |
| LOW⚡ | src/agent/deep_research/deep_research_agent.py | 434 | except Exception as e: | CODE |
| LOW⚡ | src/agent/deep_research/deep_research_agent.py | 446 | except Exception as e: | CODE |
| LOW | src/agent/deep_research/deep_research_agent.py | 402 | except Exception as e: | CODE |
| LOW | src/agent/deep_research/deep_research_agent.py | 413 | except Exception as e: | CODE |
| LOW | src/agent/deep_research/deep_research_agent.py | 457 | except Exception as e: | CODE |
| LOW | src/agent/deep_research/deep_research_agent.py | 1036 | except Exception as e: | CODE |
| LOW | src/agent/deep_research/deep_research_agent.py | 1201 | except Exception as e: | CODE |
| LOW | src/agent/deep_research/deep_research_agent.py | 1244 | except Exception as e: | CODE |
| LOW | src/agent/deep_research/deep_research_agent.py | 171 | except Exception as e: | STRING |
| LOW | src/agent/deep_research/deep_research_agent.py | 182 | except Exception as e: | STRING |
| LOW | src/agent/deep_research/deep_research_agent.py | 189 | except Exception as e: | STRING |
| LOW | src/agent/deep_research/deep_research_agent.py | 604 | except Exception as e: | STRING |
| LOW | src/agent/deep_research/deep_research_agent.py | 745 | except Exception as e: | STRING |
| LOW | src/agent/deep_research/deep_research_agent.py | 791 | except Exception as e: | STRING |
| LOW | src/agent/deep_research/deep_research_agent.py | 930 | except Exception as e: | STRING |
| LOW | src/controller/custom_controller.py | 104 | except Exception as e: | CODE |
| LOW | src/controller/custom_controller.py | 151 | except Exception as e: | CODE |
| LOW | src/webui/components/deep_research_agent_tab.py | 36 | except Exception as e: | CODE |
| LOW | src/webui/components/deep_research_agent_tab.py | 50 | except Exception as e: | CODE |
| LOW | src/webui/components/deep_research_agent_tab.py | 220 | except Exception as e: | CODE |
| LOW | src/webui/components/deep_research_agent_tab.py | 270 | except Exception as e: | CODE |
| LOW | src/webui/components/deep_research_agent_tab.py | 315 | except Exception as e: | CODE |
| LOW | src/webui/components/browser_use_agent_tab.py | 61 | except Exception as e: | CODE |
| LOW | src/webui/components/browser_use_agent_tab.py | 123 | except Exception as e: | CODE |
| LOW | src/webui/components/browser_use_agent_tab.py | 172 | except Exception as e: | CODE |
| LOW⚡ | src/webui/components/browser_use_agent_tab.py | 613 | except Exception: # Catch task exceptions if it errors on stop | CODE |
| LOW | src/webui/components/browser_use_agent_tab.py | 675 | except Exception as e: | CODE |
| LOW | src/webui/components/browser_use_agent_tab.py | 724 | except Exception as e: | CODE |
| LOW | src/webui/components/browser_use_agent_tab.py | 774 | except Exception as e: | CODE |
| LOW | src/webui/components/browser_use_agent_tab.py | 920 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/utils/utils.py | 20 | CODE | |
| LOW | src/utils/mcp_client.py | 46 | CODE | |
| LOW | src/utils/mcp_client.py | 134 | CODE | |
| LOW | src/utils/llm_provider.py | 152 | CODE | |
| LOW | src/agent/browser_use/browser_use_agent.py | 31 | CODE | |
| LOW | src/agent/browser_use/browser_use_agent.py | 48 | CODE | |
| LOW | src/agent/deep_research/deep_research_agent.py | 338 | CODE | |
| LOW | src/agent/deep_research/deep_research_agent.py | 421 | CODE | |
| LOW | src/agent/deep_research/deep_research_agent.py | 461 | CODE | |
| LOW | src/agent/deep_research/deep_research_agent.py | 609 | CODE | |
| LOW | src/agent/deep_research/deep_research_agent.py | 811 | CODE | |
| LOW | src/agent/deep_research/deep_research_agent.py | 1085 | CODE | |
| LOW | src/controller/custom_controller.py | 110 | CODE | |
| LOW | src/webui/interface.py | 22 | CODE | |
| LOW | src/webui/webui_manager.py | 97 | CODE | |
| LOW | src/webui/components/deep_research_agent_tab.py | 57 | CODE | |
| LOW | src/webui/components/browser_use_agent_tab.py | 275 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_agents.py | 358 | task_id_to_resume = "" # Set this to resume a previous task ID | CODE |
| LOW | src/utils/mcp_client.py | 67 | # Check if parameter is required | COMMENT |
| LOW | src/utils/mcp_client.py | 231 | # Check if required | COMMENT |
| LOW | src/agent/browser_use/browser_use_agent.py | 77 | # Check if waiting for user input after Ctrl+C | COMMENT |
| LOW | src/agent/browser_use/browser_use_agent.py | 82 | # Check if we should stop due to too many failures | COMMENT |
| LOW | src/agent/deep_research/deep_research_agent.py | 955 | # Check if the current indices point to a valid pending task | STRING |
| LOW⚡ | src/webui/components/browser_use_agent_tab.py | 599 | # Check if agent stopped itself or stop button was pressed (which sets agent.state.stopped) | COMMENT |
| LOW⚡ | src/webui/components/browser_use_agent_tab.py | 617 | # Check if agent is asking for help (via response_event) | COMMENT |
| LOW | src/webui/components/browser_use_agent_tab.py | 699 | elif agent_task.exception(): # Check if task finished with exception | CODE |
| LOW | src/webui/components/browser_use_agent_tab.py | 803 | # Check if waiting for user assistance | COMMENT |
| LOW | src/webui/components/browser_use_agent_tab.py | 821 | # Check if a task is currently running (using _current_task) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README.md | 30 | #### Step 1: Clone the Repository | COMMENT |
| LOW | README.md | 36 | #### Step 2: Set Up Python Environment | COMMENT |
| LOW | README.md | 58 | #### Step 3: Install Dependencies | COMMENT |
| LOW | README.md | 73 | #### Step 4: Configure Environment | COMMENT |
| LOW | README.md | 85 | #### Step 5: Enjoy the web-ui | COMMENT |
| LOW | README.md | 115 | #### Step 1: Clone the Repository | COMMENT |
| LOW | README.md | 121 | #### Step 2: Configure Environment | COMMENT |
| LOW | README.md | 133 | #### Step 3: Docker Build and Run | COMMENT |
| LOW | README.md | 142 | #### Step 4: Enjoy the web-ui and vnc | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/utils/mcp_client.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/agent/browser_use/browser_use_agent.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/agent/deep_research/deep_research_agent.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/controller/custom_controller.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/browser/custom_browser.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/browser/custom_context.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/webui/components/deep_research_agent_tab.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/webui/components/agent_settings_tab.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/webui/components/browser_use_agent_tab.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | src/webui/components/browser_settings_tab.py | 10 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/webui/components/browser_use_agent_tab.py | 918 | except (asyncio.CancelledError, asyncio.TimeoutError): | CODE |
| HIGH | src/webui/components/browser_use_agent_tab.py | 613 | except Exception: # Catch task exceptions if it errors on stop | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_agents.py | 166 | async def test_browser_use_parallel(): | CODE |
| LOW | src/utils/mcp_client.py | 17 | async def setup_mcp_client_and_tools(mcp_server_config: Dict[str, Any]) -> Optional[MultiServerMCPClient]: | CODE |
| LOW⚡ | src/agent/deep_research/deep_research_agent.py | 438 | def _save_search_results_to_json(results: List[Dict[str, Any]], output_dir: str): | CODE |
| LOW | src/agent/deep_research/deep_research_agent.py | 271 | def create_browser_search_tool( | STRING |
| LOW | src/webui/components/deep_research_agent_tab.py | 376 | def create_deep_research_agent_tab(webui_manager: WebuiManager): | CODE |
| LOW | src/webui/components/agent_settings_tab.py | 46 | def create_agent_settings_tab(webui_manager: WebuiManager): | CODE |
| LOW | src/webui/components/browser_use_agent_tab.py | 972 | def create_browser_use_agent_tab(webui_manager: WebuiManager): | CODE |
| LOW | src/webui/components/load_save_config_tab.py | 8 | def create_load_save_config_tab(webui_manager: WebuiManager): | CODE |
| LOW | src/webui/components/browser_settings_tab.py | 30 | def create_browser_settings_tab(webui_manager: WebuiManager): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_agents.py | 41 | # temperature=0.6, | COMMENT |
| LOW | tests/test_agents.py | 61 | # llm = utils.get_llm_model( | COMMENT |
| LOW | tests/test_agents.py | 181 | # temperature=0.8, | COMMENT |
| LOW | tests/test_controller.py | 21 | # "run", | COMMENT |
| LOW | tests/test_controller.py | 61 | "mcpServers": { | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/agent/deep_research/deep_research_agent.py | 876 | """You are a professional researcher tasked with writing a comprehensive and well-structured report base | STRING |
| LOW⚡ | src/webui/components/browser_use_agent_tab.py | 603 | # Ensure the task coroutine finishes if agent just set flag | COMMENT |