Control any computer remotely
This report summarizes scanner evidence for jetkvm/kvm, a TypeScript project with 5,351 GitHub stars. SynthScan examined 128,046 lines of code across 561 source files, recording 131 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 1.9 (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? 84 finding(s).
Are imports declared and package/API names verified? 3 finding(s).
Are wrappers, guards, and repeated structures necessary? 73 finding(s).
Which changes need focused human review? 131 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 131 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 |
|---|---|---|---|---|
| MEDIUM | ui/e2e/remote-agent/ra-usb-config.spec.ts | 45 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-usb-config.spec.ts | 47 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-usb-config.spec.ts | 90 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-usb-config.spec.ts | 92 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-usb-config.spec.ts | 135 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-usb-config.spec.ts | 137 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-usb-config.spec.ts | 276 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-usb-config.spec.ts | 278 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-usb-config.spec.ts | 351 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-usb-config.spec.ts | 353 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-virtual-media.spec.ts | 153 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-virtual-media.spec.ts | 155 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-display.spec.ts | 26 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-display.spec.ts | 28 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-display.spec.ts | 173 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-display.spec.ts | 175 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-display.spec.ts | 267 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-display.spec.ts | 269 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-display.spec.ts | 318 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-display.spec.ts | 320 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 34 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 36 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 116 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 118 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 174 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 176 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 283 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 285 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 762 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 764 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 970 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 972 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 1156 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-keyboard.spec.ts | 1158 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-mouse.spec.ts | 18 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-mouse.spec.ts | 20 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-mouse.spec.ts | 134 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-mouse.spec.ts | 136 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-mouse.spec.ts | 170 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-mouse.spec.ts | 172 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-mouse.spec.ts | 203 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-mouse.spec.ts | 205 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-tls.spec.ts | 11 | // ═══════════════════════════════════════════ | COMMENT |
| MEDIUM | ui/e2e/remote-agent/ra-tls.spec.ts | 13 | // ═══════════════════════════════════════════ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ui/src/keyboardLayouts/ja_JP.ts | 1 | import { KeyboardLayout, KeyCombo } from "../keyboardLayouts"; | COMMENT |
| LOW | ui/src/hooks/useKeyboard.ts | 61 | COMMENT | |
| LOW | ui/src/hooks/useKeyboard.ts | 281 | // If the keyPressReport API is not available, it simulates the device-side key | COMMENT |
| LOW | internal/native/cgo/main.h | 1 | #ifndef JETKVM_NATIVE_MAIN_H | COMMENT |
| LOW | internal/native/cgo/main.h | 21 | // typedef void (jetkvm_log_handler_t)(int level, const char *filename, const char *funcname, int line, const char *mess | COMMENT |
| LOW | internal/native/cgo/edid.c | 1 | #include "edid.h" | COMMENT |
| LOW | internal/native/cgo/video.c | 1 | #define _POSIX_C_SOURCE 200809L | COMMENT |
| LOW | internal/native/cgo/video.c | 21 | #include <rk_mpi_mmz.h> | COMMENT |
| LOW | internal/native/cgo/video.c | 401 | // VENC_CHN_ATTR_S stAttr; | COMMENT |
| LOW | internal/native/cgo/ctrl.c | 1 | #include <stdio.h> | COMMENT |
| LOW | internal/native/cgo/screen.c | 1 | #include <time.h> | COMMENT |
| LOW | internal/native/cgo/main.c | 1 | #include <stdio.h> | COMMENT |
| LOW | internal/native/cgo/main.c | 21 | void jetkvm_c_log_handler(int level, const char *filename, const char *funcname, int line, const char *message) { | COMMENT |
| LOW | internal/native/cgo/log.h | 1 | #ifndef VIDEO_DAEMON_LOG_H | COMMENT |
| LOW | internal/native/eez/src/ui/fonts.h | 21 | #endif /*EEZ_LVGL_UI_FONTS_H*/ | COMMENT |
| LOW | internal/native/eez/src/ui/images/ui_image_usb.c | 1 | #ifdef __has_include | COMMENT |
| LOW | internal/native/eez/src/ui/images/ui_image_d2.c | 1 | #ifdef __has_include | COMMENT |
| LOW | internal/native/eez/src/ui/images/ui_image_cloud.c | 1 | #ifdef __has_include | COMMENT |
| LOW | internal/native/eez/src/ui/images/ui_image_logo.c | 1 | #ifdef __has_include | COMMENT |
| LOW | internal/native/eez/src/ui/images/ui_image_arrow_icon.c | 1 | #ifdef __has_include | COMMENT |
| LOW | …ternal/native/eez/src/ui/images/ui_image_boot_logo_2.c | 1 | #ifdef __has_include | COMMENT |
| LOW | internal/native/eez/src/ui/images/ui_image_ethernet.c | 1 | #ifdef __has_include | COMMENT |
| LOW | internal/native/eez/src/ui/images/ui_image_hdmi.c | 1 | #ifdef __has_include | COMMENT |
| LOW | internal/native/eez/src/ui/images/ui_image_back_caret.c | 1 | #ifdef __has_include | COMMENT |
| LOW | internal/native/eez/src/ui/images/ui_image_check_icon.c | 1 | #ifdef __has_include | COMMENT |
| LOW | internal/native/eez/src/ui/images/ui_image_back_icon.c | 1 | #ifdef __has_include | COMMENT |
| LOW | internal/native/eez/src/ui/images/ui_image_x_icon.c | 1 | #ifdef __has_include | COMMENT |
| LOW | …native/eez/src/ui/images/ui_image_cloud_disconnected.c | 1 | #ifdef __has_include | COMMENT |
| LOW | internal/native/eez/src/ui/images/ui_image_jetkvm.c | 1 | #ifdef __has_include | COMMENT |
| LOW | internal/native/eez/src/ui/fonts/ui_font_font_bold30.c | 1 | /******************************************************************************* | COMMENT |
| LOW | internal/native/eez/src/ui/fonts/ui_font_font_book24.c | 1 | /******************************************************************************* | COMMENT |
| LOW | internal/native/eez/src/ui/fonts/ui_font_font_book20.c | 1 | /******************************************************************************* | COMMENT |
| LOW | internal/native/eez/src/ui/fonts/ui_font_font_book16.c | 1 | /******************************************************************************* | COMMENT |
| LOW | internal/native/eez/src/ui/fonts/ui_font_font_book18.c | 1 | /******************************************************************************* | COMMENT |
| LOW | internal/playoutdelay/interceptor.go | 1 | // Package playoutdelay implements the WebRTC playout-delay RTP header | COMMENT |
| LOW | internal/ota/utils.go | 261 | return nil | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ui/e2e/timesync-custom-ntp.spec.ts | 73 | async function setNtpServerAndAwaitRequest(page: Page, server: string): Promise<number> { | CODE |
| LOW | ui/e2e/failsafe.spec.ts | 41 | async function expectNativeFailsafeOverlay(page: Page): Promise<void> { | CODE |
| LOW | ui/e2e/failsafe.spec.ts | 48 | async function expectNoNativeFailsafeOverlay(page: Page): Promise<void> { | CODE |
| LOW | ui/e2e/remote-agent/remote-agent.ts | 63 | export function connectedDisplayConnectors(displays: DisplayInfo[]): string[] { | CODE |
| LOW | ui/e2e/remote-agent/shared.ts | 206 | export async function putRemoteHostToSleepForUSBWakeTest( | CODE |
| LOW | ui/e2e/remote-agent/shared.ts | 256 | export async function recoverRemoteHostAfterUSBWakeTest( | CODE |
| LOW | ui/e2e/remote-agent/shared.ts | 266 | export async function wakeRemoteHostWithWakeButton(page: Page, timeoutMs = 45000): Promise<void> { | CODE |
| LOW | ui/e2e/remote-agent/shared.ts | 283 | export async function sendBrowserInputThatMustNotWakeHost(page: Page): Promise<void> { | CODE |
| LOW | ui/e2e/remote-agent/ra-hid-write-recovery.spec.ts | 43 | function findGadgetKeyboardInterface(): string { | CODE |
| LOW | ui/e2e/helpers/ssh.ts | 28 | function escapeForSingleQuotedShell(cmd: string): string { | CODE |
| LOW | ui/e2e/helpers/hid.ts | 112 | export async function captureVideoRegionFingerprint( | CODE |
| LOW | ui/e2e/helpers/hid.ts | 240 | export async function runMouseBidirectionalCheck( | CODE |
| LOW | ui/e2e/helpers/auth.ts | 201 | export async function dismissSessionTakeoverDialog(page: Page): Promise<void> { | CODE |
| LOW | ui/e2e/helpers/auth.ts | 226 | export async function enablePasswordFromSettings( | CODE |
| LOW | ui/e2e/helpers/auth.ts | 258 | export async function changePasswordFromSettings( | CODE |
| LOW | ui/e2e/helpers/auth.ts | 292 | export async function disablePasswordFromSettings( | CODE |
| LOW | ui/src/components/WebRTCVideo.tsx | 589 | function setMouseModeEventListeners() { | CODE |
| LOW | ui/src/components/VideoOverlay.tsx | 167 | export function PeerConnectionDisconnectedOverlay({ show }: PeerConnectionDisconnectedOverlay) { | CODE |
| LOW | ui/src/components/VideoOverlay.tsx | 400 | export function NoAutoplayPermissionsOverlay({ | CODE |
| LOW | ui/src/components/UpdateInProgressStatusCard.tsx | 8 | export default function UpdateInProgressStatusCard() { | CODE |
| LOW | ui/src/hooks/useKeyboard.ts | 191 | function simulateDeviceSideKeyHandlingForLegacyDevices( | CODE |
| LOW | ui/src/hooks/useHiddenVideoStreamPause.ts | 5 | export function useHiddenVideoStreamPause(): void { | CODE |
| LOW | ui/src/webrtc/signaling/useWebSocketSignaling.ts | 138 | function cleanupAndStopReconnecting() { | CODE |
| LOW | ui/src/webrtc/signaling/useWebSocketSignaling.ts | 163 | async function setRemoteSessionDescription( | CODE |
| LOW | ui/src/routes/devices.$id.settings.general.update.tsx | 21 | export default function SettingsGeneralUpdateRoute() { | CODE |
| LOW | ui/src/routes/devices.$id.settings.general.reboot.tsx | 15 | export default function SettingsGeneralRebootRoute() { | CODE |
| LOW | …/src/routes/devices.$id.settings.access.local-auth.tsx | 14 | export default function SecurityAccessLocalAuthRoute() { | CODE |
| LOW | ui/src/routes/welcome-local.password.tsx | 66 | export default function WelcomeLocalPasswordRoute() { | CODE |
| LOW | ui/src/routes/devices.$id.mount.tsx | 54 | async function syncRemoteVirtualMediaState() { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | publish_source.sh | 3 | # Check if a commit message was provided | COMMENT |
| LOW | ui/dev_device.sh | 3 | # Check if an IP address was provided as an argument | COMMENT |
| LOW | ui/dev_device.sh | 19 | # Check if pwd is the current directory of the script | COMMENT |
| LOW⚡ | scripts/generate_proto.sh | 11 | # Check if protoc is installed | COMMENT |
| LOW⚡ | scripts/generate_proto.sh | 20 | # Check if protoc-gen-go is installed | COMMENT |
| LOW⚡ | scripts/generate_proto.sh | 27 | # Check if protoc-gen-go-grpc is installed | COMMENT |
| LOW | scripts/update_netboot_xyz.sh | 29 | # Check if we already have the same version | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | internal/ota/rpc.go | 25 | AppDownloadProgress *float32 `json:"appDownloadProgress,omitempty"` //TODO: implement for progress bar | CODE |
| LOW⚡ | internal/ota/rpc.go | 27 | SystemDownloadProgress *float32 `json:"systemDownloadProgress,omitempty"` //TODO: implement for progress bar | CODE |
| LOW⚡ | internal/ota/rpc.go | 33 | AppUpdateProgress *float32 `json:"appUpdateProgress,omitempty"` //TODO: implement for progress bar | CODE |
| LOW⚡ | pkg/nmlite/udhcpc/udhcpc.go | 219 | // TODO: implement | COMMENT |
| LOW⚡ | pkg/nmlite/udhcpc/udhcpc.go | 224 | // TODO: implement | COMMENT |
| LOW⚡ | pkg/nmlite/udhcpc/udhcpc.go | 228 | // TODO: implement | COMMENT |
| LOW | pkg/nmlite/jetdhcpc/client.go | 308 | // TODO: implement | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | ui/e2e/remote-agent/ra-usb-emulation.spec.ts | 40 | print(json.dumps(leds)) | CODE |
| HIGH | ui/e2e/remote-agent/ra-usb-enumeration-recovery.spec.ts | 50 | print(json.dumps(devices)) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | internal/confparser/confparser.go | 35 | // first we need to check if the config is a pointer | COMMENT |
| LOW | internal/confparser/confparser.go | 258 | // if the field is not required, we need to check if it's required_if | COMMENT |
| LOW | internal/usbgadget/changeset.go | 38 | FileStateSymlinkInOrderConfigFS // configfs is a shithole, so we need to check if the symlinks are created in the corre | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | publish_source.sh | 22 | # Create a temporary branch for the release | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ui/src/components/Header.tsx | 55 | //userEmail = "user@example.org"; | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ui/tools/find_unused_messages.py | 28 | CODE |