High Performance Open Source Radio Control Link
This report summarizes scanner evidence for ExpressLRS/ExpressLRS, a C project with 5,452 GitHub stars. SynthScan examined 125,985 lines of code across 465 source files, recording 299 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 3.1 (Low 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.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 236 finding(s).
Are imports declared and package/API names verified? 35 finding(s).
Are wrappers, guards, and repeated structures necessary? 60 finding(s).
Which changes need focused human review? 299 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 299 distinct pattern matches across 13 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 | src/.travis.yml | 1 | # Continuous Integration (CI) is the practice, in software | COMMENT |
| LOW | src/.travis.yml | 21 | COMMENT | |
| LOW | src/.travis.yml | 41 | # - platformio run | COMMENT |
| LOW | src/.travis.yml | 61 | # | COMMENT |
| LOW | src/user_defines.txt | 1 | ### The Legal Stuff ### | COMMENT |
| LOW | src/user_defines.txt | 21 | #-DRegulatory_Domain_EU_868 | COMMENT |
| LOW | src/user_defines.txt | 41 | COMMENT | |
| LOW | src/user_defines.txt | 61 | #-DDEBUG_LOG | COMMENT |
| LOW | src/user_defines.txt | 81 | # ID,Antenna,RSSI,LQ,SNR,PWR,FHSS,TimingOffset | COMMENT |
| LOW | src/test/test_msp2crsf2msp/test_msp2crsf2msp.cpp | 61 | COMMENT | |
| LOW | src/test/test_gps/test_gps.cpp | 1 | #include <cstring> | COMMENT |
| LOW | src/test/test_crc/test_crc.cpp | 1 | #include <cstdint> | COMMENT |
| LOW | src/test/test_scorpion/test_scorpion.cpp | 1 | #include <algorithm> | COMMENT |
| LOW | src/python/test_tools/power_sweep.py | 1 | # This script runs an automated voltage sweep while collecting ADC DBGLN() output | COMMENT |
| LOW | src/python/external/six.py | 1 | # Copyright (c) 2010-2020 Benjamin Peterson | COMMENT |
| LOW | src/python/external/esptool/esptool.py | 1 | #!/usr/bin/env python | COMMENT |
| LOW | src/python/external/jmespath/functions.py | 101 | # Type checking involves checking the top level type, | COMMENT |
| LOW | src/python/external/jmespath/visitor.py | 21 | # False | COMMENT |
| LOW | src/include/native.h | 1 | #pragma once | COMMENT |
| LOW | src/include/common.h | 1 | #pragma once | COMMENT |
| LOW | src/include/common.h | 281 | #define RATE_MAX 6 | COMMENT |
| LOW | src/include/crsf_protocol.h | 1 | #pragma once | COMMENT |
| LOW | src/include/crsf_protocol.h | 21 | #define CRSF_CHANNEL_VALUE_1000 191 // 1000us | COMMENT |
| LOW | src/include/telemetry_protocol.h | 1 | #pragma once | COMMENT |
| LOW | src/include/targets.h | 1 | #pragma once | COMMENT |
| LOW | src/include/targets.h | 21 | #define ICACHE_RAM_ATTR IRAM_ATTR | COMMENT |
| LOW | src/include/targets.h | 41 | extern bool pwmSerialDefined; | COMMENT |
| LOW | src/include/targets.h | 61 | #elif defined(RADIO_SX127X) || defined(RADIO_LR1121) || defined(RADIO_LR2021) | COMMENT |
| LOW | src/include/targets.h | 81 | #define U0TXD_GPIO_NUM (1) | COMMENT |
| LOW | src/include/target/Unified_ESP8285_TX.h | 1 | // Serial | COMMENT |
| LOW | src/include/target/Unified_ESP8285_TX.h | 21 | COMMENT | |
| LOW | src/include/target/Unified_ESP8285_TX.h | 41 | #define POWER_OUTPUT_VALUES2_COUNT POWER_OUTPUT_VALUES_COUNT | COMMENT |
| LOW | src/include/target/Unified_ESP8285_TX.h | 61 | #define WS2812_VTX_STATUS_LEDS hardware_i16_array(HARDWARE_ledidx_rgb_vtx) | COMMENT |
| LOW | src/include/target/Unified_ESP8285_TX.h | 81 | #define OPT_HAS_GSENSOR_STK8xxx false | COMMENT |
| LOW | src/include/target/Unified_ESP32_TX.h | 1 | // Serial | COMMENT |
| LOW | src/include/target/Unified_ESP32_TX.h | 21 | #define LR1121_RFSW_CTRL hardware_u16_array(HARDWARE_radio_rfsw_ctrl) | COMMENT |
| LOW | src/include/target/Unified_ESP32_TX.h | 41 | #define SKY85321_PDET_SLOPE hardware_float(HARDWARE_power_pdet_slope) | COMMENT |
| LOW | src/include/target/Unified_ESP32_TX.h | 61 | #define USER_BUTTON_LED hardware_pin(HARDWARE_button_led_index) | COMMENT |
| LOW | src/include/target/Unified_ESP32_TX.h | 81 | COMMENT | |
| LOW | src/include/target/Unified_ESP32_TX.h | 101 | // OLED/TFT | COMMENT |
| LOW | src/include/target/Unified_ESP32_TX.h | 121 | #define GPIO_PIN_DEBUG_TX hardware_pin(HARDWARE_debug_backpack_tx) | COMMENT |
| LOW | src/include/target/Unified_ESP32_TX.h | 141 | #define OPT_HAS_THERMAL_LM75A hardware_flag(HARDWARE_thermal_lm75a) | COMMENT |
| LOW | src/include/target/Unified_ESP_RX.h | 1 | // Serial | COMMENT |
| LOW | src/include/target/Unified_ESP_RX.h | 21 | #define OPT_USE_HARDWARE_DCDC hardware_flag(HARDWARE_radio_dcdc) | COMMENT |
| LOW | src/include/target/Unified_ESP_RX.h | 41 | COMMENT | |
| LOW | src/include/target/Unified_ESP_RX.h | 61 | #define GPIO_LED_GREEN_INVERTED false | COMMENT |
| LOW | src/include/target/Unified_ESP_RX.h | 81 | COMMENT | |
| LOW | src/include/target/Unified_ESP_RX.h | 101 | #define GPIO_PIN_FAN_SPEEDS hardware_u16_array(HARDWARE_misc_fan_speeds) | COMMENT |
| LOW | src/lib/WIFI/lr1121.cpp | 1 | #include "targets.h" | COMMENT |
| LOW | src/lib/WIFI/devWIFI.cpp | 1 | #include "device.h" | COMMENT |
| LOW | src/lib/WIFI/devWIFI.cpp | 21 | #endif | COMMENT |
| LOW | src/lib/WIFI/devWIFI.cpp | 41 | #endif | COMMENT |
| LOW | src/lib/WIFI/TcpMspConnector.h | 1 | #pragma once | COMMENT |
| LOW | src/lib/WIFI/wifiJoystick.cpp | 1 | #include "device.h" | COMMENT |
| LOW | src/lib/AnalogVbat/devAnalogVbat.cpp | 1 | #include "devAnalogVbat.h" | COMMENT |
| LOW | src/lib/OPTIONS/hardware.cpp | 1 | #if !defined(UNIT_TEST) | COMMENT |
| LOW | src/lib/LR1121Driver/LR1121.cpp | 1 | #include "LR1121.h" | COMMENT |
| LOW | src/lib/LR1121Driver/LR1121_Regs.h | 41 | #define LR1121_POWER_MAX_LP_PA (14) | COMMENT |
| LOW | src/lib/LR1121Driver/LR1121Driver.h | 1 | #pragma once | COMMENT |
| LOW | src/lib/VTXSPI/devVTXSPI.cpp | 1 | #include "targets.h" | COMMENT |
| 107 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/python/UnifiedConfiguration.py | 116 | except: | CODE |
| HIGH | src/python/UnifiedConfiguration.py | 133 | except: | CODE |
| HIGH | src/python/serials_find.py | 26 | except ImportError: | CODE |
| HIGH | src/python/elrs_helpers.py | 27 | except: | CODE |
| HIGH | src/python/test_tools/power_sweep.py | 65 | except ValueError: | CODE |
| HIGH | src/python/external/streamexpect.py | 492 | except socket.timeout: | CODE |
| HIGH | src/python/external/six.py | 103 | except AttributeError: | CODE |
| HIGH | src/python/external/six.py | 209 | except KeyError: | CODE |
| HIGH | src/python/external/esptool/esptool/__init__.py | 829 | except AttributeError: | CODE |
| HIGH | src/python/external/esptool/esptool/loader.py | 44 | except TypeError: | CODE |
| HIGH | src/python/external/esptool/esptool/loader.py | 1386 | except NotImplementedInROMError: | CODE |
| HIGH | src/python/external/esptool/esptool/cmds.py | 752 | except AttributeError: | CODE |
| HIGH | src/python/external/esptool/esptool/cmds.py | 708 | except AttributeError: | CODE |
| HIGH | src/python/external/esptool/esptool/cmds.py | 557 | except NotImplementedInROMError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …ython/external/esptool/esptool/targets/esp32h2beta1.py | 0 | access class for esp32h2beta2 stub loader, runs on top of rom. (basically the same as esp32stubloader, but different bas | STRING |
| HIGH | …ython/external/esptool/esptool/targets/esp32s3beta2.py | 0 | access class for esp32h2beta2 stub loader, runs on top of rom. (basically the same as esp32stubloader, but different bas | STRING |
| HIGH | src/python/external/esptool/esptool/targets/esp32s3.py | 0 | access class for esp32h2beta2 stub loader, runs on top of rom. (basically the same as esp32stubloader, but different bas | STRING |
| HIGH | src/python/external/esptool/esptool/targets/esp32c3.py | 0 | access class for esp32h2beta2 stub loader, runs on top of rom. (basically the same as esp32stubloader, but different bas | STRING |
| HIGH | src/python/external/esptool/esptool/targets/esp32s2.py | 0 | access class for esp32h2beta2 stub loader, runs on top of rom. (basically the same as esp32stubloader, but different bas | STRING |
| HIGH | src/python/external/esptool/esptool/targets/esp32c2.py | 0 | access class for esp32h2beta2 stub loader, runs on top of rom. (basically the same as esp32stubloader, but different bas | STRING |
| HIGH | …ython/external/esptool/esptool/targets/esp32h2beta2.py | 0 | access class for esp32h2beta2 stub loader, runs on top of rom. (basically the same as esp32stubloader, but different bas | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/python/bind.py | 5 | CODE | |
| LOW | src/python/set_model.py | 5 | CODE | |
| LOW | src/python/external/six.py | 23 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 42 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 68 | CODE | |
| LOW | src/python/external/jmespath/compat.py | 1 | CODE | |
| LOW | src/python/external/jmespath/compat.py | 3 | CODE | |
| LOW | src/python/external/jmespath/__init__.py | 2 | CODE | |
| LOW | src/python/external/inputimeout/__init__.py | 1 | CODE | |
| LOW | src/python/external/inputimeout/__init__.py | 1 | CODE | |
| LOW | src/python/external/inputimeout/__init__.py | 2 | CODE | |
| LOW | src/python/external/inputimeout/__init__.py | 2 | CODE | |
| LOW | src/python/external/inputimeout/__init__.py | 2 | CODE | |
| LOW | src/python/external/inputimeout/__init__.py | 2 | CODE | |
| LOW | src/python/external/inputimeout/__init__.py | 2 | CODE | |
| LOW | src/python/external/inputimeout/__init__.py | 2 | CODE | |
| LOW | src/python/external/inputimeout/__init__.py | 2 | CODE | |
| LOW | src/python/external/inputimeout/__init__.py | 2 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/python/build_env_setup.py | 33 | def strip_float_stdio_link_flags(): | CODE |
| LOW | src/python/external/esptool/esptool/bin_image.py | 645 | def get_alignment_data_needed(segment): | CODE |
| LOW | src/python/external/esptool/esptool/__init__.py | 893 | def get_default_connected_device( | CODE |
| LOW | src/python/external/esptool/esptool/cmds.py | 225 | def _update_image_flash_params(esp, address, args, image): | CODE |
| LOW | src/python/external/esptool/esptool/targets/esp32.py | 102 | def is_flash_encryption_key_valid(self): | CODE |
| LOW | src/python/external/esptool/esptool/targets/esp32.py | 147 | def get_encrypted_download_disabled(self): | CODE |
| LOW | src/python/external/esptool/esptool/targets/esp32.py | 156 | def get_flash_encryption_enabled(self): | CODE |
| LOW | …ython/external/esptool/esptool/targets/esp32h2beta1.py | 129 | def is_flash_encryption_key_valid(self): | CODE |
| LOW | src/python/external/esptool/esptool/targets/esp32c3.py | 152 | def is_flash_encryption_key_valid(self): | CODE |
| LOW | src/python/external/esptool/esptool/targets/esp32s2.py | 207 | def is_flash_encryption_key_valid(self): | CODE |
| LOW | src/python/external/esptool/esptool/targets/esp32s3.py | 130 | def is_flash_encryption_key_valid(self): | CODE |
| LOW | src/python/external/esptool/esptool/targets/esp32c2.py | 120 | def is_flash_encryption_key_valid(self): | CODE |
| LOW | src/python/external/jmespath/functions.py | 361 | def _convert_to_jmespath_type(self, pyobject): | CODE |
| LOW | src/python/external/jmespath/parser.py | 140 | def _token_nud_unquoted_identifier(self, token): | CODE |
| LOW | src/python/external/jmespath/parser.py | 143 | def _token_nud_quoted_identifier(self, token): | CODE |
| LOW | src/python/external/jmespath/parser.py | 472 | def _raise_parse_error_for_token(self, token, reason): | CODE |
| LOW | src/python/external/jmespath/parser.py | 479 | def _raise_parse_error_maybe_eof(self, expected_type, token): | CODE |
| LOW | src/python/external/jmespath/visitor.py | 166 | def visit_function_expression(self, node, value): | CODE |
| LOW | src/python/external/jmespath/lexer.py | 120 | def _initialize_for_expression(self, expression): | CODE |
| LOW | src/python/external/jmespath/lexer.py | 179 | def _consume_quoted_identifier(self): | CODE |
| LOW | src/python/external/jmespath/lexer.py | 192 | def _consume_raw_string_literal(self): | CODE |
| LOW | src/html/dev-plugins/dev-mock-plugin.js | 161 | function countVoltageSourcesFromHardware(hardware) { | CODE |
| LOW | src/html/dev-plugins/dev-mock-plugin.js | 170 | function syncVoltageSourcesFromHardware(hardware) { | CODE |
| LOW | …html/build-plugins/inline-static-html-assets-plugin.js | 19 | export function inlineStaticHtmlAssetsPlugin() { | CODE |
| LOW | src/html/build-plugins/feature-blocks-plugin.js | 20 | export function createFeatureBlockProcessor(env) { | CODE |
| LOW | src/html/build-plugins/css-tree-shake-plugin.js | 55 | function collectUsedCssTokensFromBundle(bundle) { | CODE |
| LOW | src/html/build-plugins/css-tree-shake-plugin.js | 129 | function extractRequiredTokensFromSelector(selector) { | CODE |
| LOW | src/html/build-plugins/css-tree-shake-plugin.js | 157 | function selectorIsDefinitelyUnused(selector, usedTokens) { | CODE |
| LOW | src/html/build-plugins/css-tree-shake-plugin.js | 215 | async function collectUsedCssTokensFromSource(root, processHtml, processJs) { | CODE |
| LOW | src/html/src/pages/voltage-calibration-panel.js | 41 | function getVoltageSourcesFromHardware(hardware) { | CODE |
| LOW | src/lua/elrs.lua | 444 | local function parseParameterInfoMessage(data) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/python/crsf.py | 54 | CODE | |
| LOW | src/python/crsf.py | 101 | CODE | |
| LOW | src/python/UnifiedConfiguration.py | 44 | CODE | |
| LOW | src/python/BFinitPassthrough.py | 121 | CODE | |
| LOW | src/python/serials_find.py | 5 | CODE | |
| LOW | src/python/binary_flash.py | 126 | CODE | |
| LOW | src/python/binary_configurator.py | 53 | CODE | |
| LOW | src/python/binary_configurator.py | 123 | CODE | |
| LOW | src/python/binary_configurator.py | 182 | CODE | |
| LOW | src/python/test_tools/power_sweep.py | 50 | CODE | |
| LOW | src/python/test_tools/power_sweep.py | 68 | CODE | |
| LOW | src/python/external/esptool/esptool/bin_image.py | 50 | CODE | |
| LOW | src/python/external/esptool/esptool/bin_image.py | 606 | CODE | |
| LOW | src/python/external/esptool/esptool/bin_image.py | 830 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 76 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 870 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 929 | CODE | |
| LOW | src/python/external/esptool/esptool/__init__.py | 732 | CODE | |
| LOW | src/python/external/esptool/esptool/loader.py | 1390 | CODE | |
| LOW | src/python/external/esptool/esptool/loader.py | 604 | CODE | |
| LOW | src/python/external/esptool/esptool/cmds.py | 67 | CODE | |
| LOW | src/python/external/esptool/esptool/cmds.py | 309 | CODE | |
| LOW | src/python/external/esptool/esptool/cmds.py | 772 | CODE | |
| LOW | src/python/external/jmespath/functions.py | 136 | CODE | |
| LOW | src/python/external/jmespath/functions.py | 197 | CODE | |
| LOW | src/python/external/jmespath/functions.py | 295 | CODE | |
| LOW | src/python/external/jmespath/parser.py | 391 | CODE | |
| LOW | src/python/external/jmespath/lexer.py | 26 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/python/UnifiedConfiguration.py | 151 | except Exception: | CODE |
| LOW⚡ | src/python/external/esptool/esptool/__init__.py | 792 | except Exception as e: | CODE |
| LOW⚡ | src/python/external/esptool/esptool/__init__.py | 799 | except Exception as e: | CODE |
| LOW | src/python/external/esptool/esptool/loader.py | 56 | except Exception: | CODE |
| LOW | src/python/external/esptool/esptool/cmds.py | 254 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/python/external/esptool/esptool/__init__.py | 795 | # Check if XMC SPI flash chip booted-up successfully, fix if not | COMMENT |
| LOW⚡ | src/python/external/esptool/esptool/__init__.py | 809 | # Check if stub supports chosen flash size | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/python/external/esptool/esptool/loader.py | 426 | # otherwise, just return the 'val' field which comes from the reply header | COMMENT |
| LOW | src/python/external/jmespath/parser.py | 188 | # just use emit an index node here if we're not dealing | COMMENT |
| LOW | src/python/external/jmespath/parser.py | 333 | # we can avoid creating another node and instead just add | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/lib/Baro/baro_spl06.cpp | 50 | // Step 1: Load calibration data | COMMENT |
| LOW | src/lib/Baro/baro_spl06.cpp | 69 | // Step 2: Set up oversampling and FIFO | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/lib/Baro/baro_spl06.cpp | 50 | // Step 1: Load calibration data | COMMENT |
| LOW | src/lib/Baro/baro_spl06.cpp | 69 | // Step 2: Set up oversampling and FIFO | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/python/external/streamexpect.py | 795 | __all__ = [ | CODE |
| LOW | src/python/external/esptool/esptool/__init__.py | 8 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/python/external/jmespath/parser.py | 510 | CODE |