TavernKeeper Scan Report

ganon3264/focus

Commit 7900468 Reviewed

No material or immediate-danger concern was identified in this review.

This advisory report describes what the named tools and review process found at one exact commit. Unknown or unobserved behavior may still exist.

0 immediate danger 0 material 64 low

What this review found

No material or immediate-danger item was identified.

Minor cautions

JavaScript analysis reported javascript.download-to-execution

Minor caution · medium confidence

When showing the trash bin, the app builds a list of deleted items by stitching their names directly into HTML. If an item had a specially crafted name containing script code, that code could run when the trash bin opens. Since this is a local app and most data is created by the user themselves, the risk is low, but imported character cards could carry such names. Escaping the names before inserting them into HTML would fix this.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The trash modal fetches entity data from the local API and builds an HTML string that is inserted via insertAdjacentHTML. Server-returned fields such as item.name and item.id are concatenated directly into the HTML and into onclick attribute strings without HTML entity encoding. If an entity name contained embedded HTML or JavaScript, it could execute in the page context when the trash modal renders. The single-quote escaping on item.name (line 99) mitigates attribute breakout partially but does not prevent HTML injection in the span context (line 95) or event handler injection. In this local-first application, the entity data is primarily user-created locally, so an external attacker-controlled path is not demonstrated. However, the project supports importing external character cards, which could carry crafted names. The attack would require importing a malicious card, deleting it, and then opening the trash bin, making exploitation indirect. This is a DOM XSS weakness worth fixing but does not rise to material risk given the local execution context and indirect trigger path.

Impact: low · Exploitability: unlikely

Developer action: HTML-encode entity names and IDs before concatenating them into HTML strings, or use DOM APIs (createElement, textContent) instead of string concatenation for user-controlled fields rendered in the trash modal.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/modals/shared-entity-modal.js:1-53

JavaScript analysis reported javascript.download-to-execution

Minor caution · medium confidence

The code displays character names in a confirmation dialog by inserting them directly as HTML. Since the names come from the user's own app, this is unlikely to cause harm, but it is a fragile pattern. No actual security breach is demonstrated.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: Detailed technical wording was omitted by the public report safety filter.

Impact: low · Exploitability: unlikely

Developer action: Escape dynamic values before inserting them into HTML template literals, or use textContent for user-controlled text in confirmation dialogs.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/features/char-editor.js:5-52

JavaScript analysis reported javascript.download-to-execution

Minor caution · medium confidence

The code builds HTML by stitching together data from the app's own server. While this is generally safe because the data comes from the same app, using string concatenation for HTML is a fragile pattern that could become a problem if the data format ever changes. No actual security issue is demonstrated.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The file fetches backup metadata from the same-origin API and interpolates server-returned fields (b.id, b.size_bytes) into HTML strings assigned via innerHTML, including within onclick attribute values. If a backup ID contained quotes or HTML special characters, it could break the attribute boundary. However, backup IDs appear to be server-generated timestamps, the data is same-origin, and there is no evidence of attacker-controlled input reaching these interpolations. This is a code quality concern rather than a demonstrated vulnerability.

Impact: low · Exploitability: unlikely

Developer action: Prefer creating DOM elements programmatically or use textContent for dynamic values instead of concatenating server data into HTML strings and onclick attributes.

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/features/backup-manager.js:1-43
Deterministic technical evidence (46)
  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-scroll-manager.js:44

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-status-panel.js:72

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-state-manager.js:28

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-delete-mode.js:74

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-list-manager.js:24

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-list-manager.js:24

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-modal-controller.js:85

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-reasoning-visibility.js:24

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-lightbox.js:78

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-edit-entity.js:58

  • JavaScript analysis reported javascript.xray.shady-link · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-notifications.js:149

  • JavaScript analysis reported javascript.xray.shady-link · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-lightbox.js:47

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-edit-entity.js:58

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-edit-entity-deferred.js:66

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-extract-data.js:23

  • JavaScript analysis reported javascript.xray.shady-link · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-file-staging.js:55

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-edit-message.js:102

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-message-renderer.js:46

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-state-manager.js:28

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-message-renderer.js:46

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-lightbox.js:78

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-message-pruner.js:84

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-notifications.js:58

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-status-panel.js:72

  • JavaScript analysis reported javascript.xray.encoded-literal · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-theme-manager.js:95

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-edit-message.js:102

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-message-pruner.js:84

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-reasoning-visibility.js:24

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-modal-controller.js:85

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-backup-manager.js:35

  • JavaScript analysis reported javascript.xray.shady-link · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-extract-data.js:30

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-scroll-manager.js:44

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-theme-manager.js:83

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-edit-entity-deferred.js:66

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-char-editor.js:69

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-api-paths.js:7

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-notifications.js:58

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-api-paths.js:7

  • JavaScript analysis reported javascript.xray.shady-link · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-backup-manager.js:31

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-theme-manager.js:83

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-file-staging.js:83

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-delete-mode.js:74

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-file-staging.js:83

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-backup-manager.js:35

  • OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval · opengrep 1.26.0

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: owned-inert-tooling · Execution scope: test-documentation-data

    Source: tests/frontend/test-char-editor.js:69

  • JavaScript analysis reported javascript.xray.unsafe-stmt · javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1

    This technical signal is not part of the shipped runtime behavior.

    Policy reason: javascript-xray-inert-content · Execution scope: test-documentation-data

    Source: tests/frontend/test-extract-data.js:23

Contextual expected matches (14)

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

The scanner flagged a text pattern that looks like a link, but it is actually the standard prefix used when reading streamed chat data from the app's own server. No external URL is involved.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.shady-link. The match applies to this repository.

Contextual assessment: The flagged line checks line.startsWith('data: ') which is the standard Server-Sent Events (SSE) protocol prefix for parsing streaming chat responses. This is not an external or suspicious link; it is a protocol delimiter for parsing the application's own streaming API response.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.shady-link
File role
production
Source
static/js/core/chat-stream.js:165

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

This code saves display preferences like sort order to the app's backend and sets up list filtering and sorting functions. The function names used are provided by the app itself, not from any external or untrusted source. This is normal user interface behavior.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The flagged region contains a fetch call to the local settings API for persisting UI preferences, and dynamic window property assignments using config-provided function name strings (cfg.filterFn, cfg.sortFn, etc.). The config values are defined by the application's own setup code, not derived from network responses or user input. No network response data reaches a dynamic code execution sink. The window[cfg.fnName] pattern is standard dynamic dispatch with internally-controlled strings. This is normal UI list management behavior.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/ui/list-manager.js:3-18

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

This file saves user settings to the app's own server. The scanner flagged it because it saw network requests, but there is no code execution happening here—just normal data saving.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The file contains fetch calls to same-origin API endpoints (/api/chats/, /api/settings/active-provider) for persisting application state. No dynamic code execution sink (eval, Function, innerHTML, etc.) is present in the supplied source. The scanner correlation between network retrieval and code execution is a false positive; the file only performs state persistence via standard HTTP requests.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/core/state-manager.js:1-68

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

The code lets users stage files for upload and shows thumbnails. It only talks to the app's own server and safely displays file names. This is normal for an attachment feature.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The scanner flags fetch and innerHTML in the same file. The fetch call posts staged files to the app's own attachment endpoint (window.api.chatAttachments). The innerHTML assignments render file-staging thumbnails using SVG sprites from window.getSvgSprite and static markup; file names are inserted via textContent (line 52), not innerHTML. No external URLs, no eval, no dynamic code execution. This is expected file-upload staging UI behavior.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/messages/file-staging.js:1-150

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

This file manages UI color themes. It sends theme choices to the app's own backend and applies colors to the page. There is no code that downloads and runs external code, so the scanner alert is a false positive.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The scanner correlated fetch calls with a presumed code-execution sink within lines 38-107. The fetch calls target same-origin relative REST endpoints (/api/settings/theme, /api/themes, /api/characters/) for theme CRUD and settings persistence, which is normal for a theme manager. No dynamic code execution sink (eval, Function constructor, innerHTML assignment, script injection, etc.) exists in the flagged range or the full file. The operations present are CSS custom property assignment via document.documentElement.style.setProperty and CustomEvent dispatch, neither of which constitutes code execution. All data flows are confined to same-origin API calls and local DOM styling, consistent with the project's stated theming purpose.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/ui/theme-manager.js:38-107

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

The scanner flagged a URL-like text, but it is just the standard namespace identifier required for SVG graphics. It is not a link to any external site and does nothing on its own.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.shady-link. The match applies to this repository.

Contextual assessment: The flagged content is a static HTML fragment containing an SVG icon with the XML namespace attribute xmlns set to the standard W3C SVG namespace. This is a namespace identifier, not a navigable or suspicious external link. No network access or data exfiltration occurs.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.shady-link
File role
production
Source
static/js/features/backup-manager.js:1

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

This code updates the status display, loads prompt configuration panels, and creates new chats by calling the app's own backend. The fetched data is used for display updates and page navigation, not for running code. This is normal application behavior.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The flagged region contains htmx.ajax calls to local partial endpoints and a fetch to the local chats API. The htmx swap uses innerHTML but htmx processes server-returned HTML fragments from the project's own backend, which is the standard htmx usage pattern. The newChat function navigates using a server-returned id via window.location.href, which is a navigation, not a code execution sink. No eval, Function constructor, or script injection from untrusted network data is demonstrated. This is standard status panel and chat creation behavior consistent with the project's purpose.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/ui/status-panel.js:79-104

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

The scanner noticed both network requests and HTML rendering in the same file. This is normal for a chat app—it fetches responses from its own server and displays them. There is no evidence of downloading and running remote code.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The file contains fetch calls to the application's own streaming endpoint (window.api.stream) and uses innerHTML to render messages via window.renderMessage. This is standard chat application behavior: retrieving generation results from the same-origin API and displaying them. No evidence of downloading remote code and executing it. The innerHTML assignment goes through a render function that is expected to sanitize content.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/core/chat-stream.js:1-133

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

This file handles selecting and deleting chat messages. It sends delete requests to the app's own backend and then refreshes the message list on screen. There is no hidden code execution, no external data sending, and no credential handling. The scanner flagged the combination of a network request with a screen update, but both are normal parts of how the app works.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The scanner correlates a network retrieval primitive with a code execution sink. The actual code contains a fetch POST to a same-origin bulk-delete endpoint and an htmx.ajax GET that swaps innerHTML from a same-origin partial endpoint. Neither fetch nor htmx.ajax constitutes a dynamic code execution sink such as eval or new Function. The data flow is confined to the application's own API endpoints, the request body is a JSON list of checkbox-selected message IDs, and the response triggers a standard htmx DOM swap. This is normal chat UI functionality proportionate to the project's stated purpose.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/messages/delete-mode.js:1-68

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

The code fetches message data from the app's own server and builds an editing interface. Any user-provided text is escaped before being shown. This is normal behavior for a message-editing feature, not a security threat.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The scanner flags co-occurrence of fetch and innerHTML. The fetch calls target the project's own API endpoints (window.api.chatMessage, window.api.chatAttachments) for loading and saving chat message edits. The innerHTML assignments construct DOM for the edit modal and tool-call cards; all user-controlled values are passed through window.escapeHtml before insertion. No external network destinations, no eval, no Function constructor, and no obfuscated data flow are present. This is standard frontend CRUD behavior proportional to the stated purpose.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/messages/edit-message.js:1-120

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

The code handles editing characters or personas, including uploading images and saving changes. It only communicates with the app's own server and builds the editing interface safely. This is normal behavior for an edit feature.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The scanner flags fetch and innerHTML co-occurrence. The fetch calls target the app's own API endpoints (cfg.apiImages, cfg.apiAvatar, cfg.apiImage, cfg.apiGet) for uploading images, deleting images, and patching entity data. The htmx.ajax calls target the app's own partial endpoints for prompt arranger and card refresh. innerHTML is not directly assigned with user content in this file; DOM manipulation uses createElement and dataset attributes. JSON.parse on dataset values is wrapped in try/catch. No external destinations, no eval, no obfuscation. This is expected entity-editing modal behavior.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/modals/edit-entity.js:1-281

JavaScript analysis reported javascript.xray.unsafe-regex

Expected behavior · high confidence

The code uses a pattern to find external image links in rendered messages and replace them with click-to-load placeholders. The pattern is safely constructed and does not pose a performance or security risk.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.xray.unsafe-regex. The match applies to this repository.

Contextual assessment: Detailed technical wording was omitted by the public report safety filter.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.xray.unsafe-regex
File role
production
Source
static/js/messages/message-renderer.js:55

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

The code refreshes chat messages by fetching updated HTML from the app's own server and rendering markdown content safely through a sanitizer. This is normal behavior for updating the chat display.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The scanner flags fetch and innerHTML co-occurrence. The fetch calls retrieve partial HTML from the app's own server endpoints (/partials/message/... and window.api.partials.messageList). Responses are parsed via DOMParser into a detached document, and elements are transplanted via replaceWith. The innerHTML assignment on line 18 sets el.innerHTML to window.renderMessage(el.textContent), which runs the content through marked and DOMPurify.sanitize before insertion. No external destinations, no eval, no obfuscation. This is standard message-refresh UI behavior.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/messages/message-refresh.js:1-45

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

This code fetches available AI models from the app's own backend and displays them in the user interface. The fetched data is used to populate lists and update text labels, not to run code. This is normal and expected for an app that manages AI provider connections.

Technical evidence

Scanner reason: JavaScript analysis matched static JavaScript security signal javascript.download-to-execution. The match applies to this repository.

Contextual assessment: The flagged region contains fetch calls to the project's own local API endpoints (providerFetchModels and the openrouter endpoints path). Response data flows into CustomEvent details and DOM text content updates via dispatchEvent and textContent assignments. No eval, Function constructor, or other dynamic code execution sink is reached by network response data. The innerHTML assignments in the surrounding code set static placeholder strings, not server-returned content. This is standard provider-model fetching behavior consistent with the project's stated purpose.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
javascript-analysis webcrack-2.16.0_js-x-ray-16.0.0_signatures-1_literals-1_families-1
Rule
javascript.download-to-execution
File role
production
Source
static/js/modals/providers.js:119-161

Related contextual observations

Unescaped server data inserted into HTML via insertAdjacentHTML in trash modal

low risk · medium confidence

Item names and image paths from the server are placed directly into the page's HTML without cleaning them first. A malicious name could contain hidden code that runs when the trash list is displayed.

Technical assessment

At lines 89 and 95, server-returned imgUrl and item.name are concatenated into an HTML string that is inserted into the DOM at line 114 via insertAdjacentHTML. Neither field is HTML-entity encoded. A crafted name containing script tags or event handlers would execute in the page context. The imgUrl field is similarly concatenated into an img src attribute without encoding.

Impact: low · Exploitability: unlikely

Developer action: Escape all server-returned string values before inserting them into HTML markup, or build DOM elements programmatically with textContent for text fields.

Sources:

Coverage and limitations

JavaScript coverage

Unresolved JavaScript stages

Tools

Limitations

Technical scan identity