TavernKeeper Scan Report

ddkhan24/hordestudio

Commit 3e5df94 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 56 low

What this review found

No material or immediate-danger item was identified.

Minor cautions

JavaScript analysis reported javascript.xray.unsafe-regex

Minor caution · medium confidence

The project uses many regular expressions to process text. Some scanners worry they could be slow if fed tricky input, but the supplied code doesn't show any pattern that is likely to freeze your browser or steal data.

Technical evidence

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

Contextual assessment: The unsafe-regex signal highlights 31 regex patterns used for input validation, parsing, and content filtering. None of the patterns in the evidence exhibit nested quantifiers or alternations known to cause catastrophic backtracking. User or model input could reach these regexes, but no concrete ReDoS vector is demonstrated. Even if a crafted input caused a brief slowdown, the impact is a recoverable client-side delay, not data loss or exfiltration.

Impact: low · Exploitability: unlikely

Developer action: Consider reviewing the flagged patterns with a ReDoS tool if performance feedback ever surfaces, but no immediate change is required.

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
app.js:258

JavaScript analysis reported javascript.xray.unsafe-regex

Minor caution · medium confidence

A pattern used to detect greetings could potentially be slowed down by a specially crafted message, but you would have to type it yourself and the input is limited. It's not a serious 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: The regex on line 417 `/^(?:(?:hey|hi|hello|yo|sup)(?:\s+pip)?|(?:are you|you) there)[\s!?.,]*$/i` is complex with nested alternations and optional groups. While user input is capped at 1000 characters before reaching this regex, crafted input could cause ReDoS with catastrophic backtracking on certain engines. The practical risk is low because input originates from the user's own typing, not from a remote attacker, and the regex is bounded by input length. However, it is a minor code quality issue.

Impact: low · Exploitability: unlikely

Developer action: Consider rewriting the greeting regex to avoid nested alternations and optional groups, e.g., using word boundaries or simpler alternation, to prevent potential ReDoS.

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
labs-ui.js:417
Deterministic technical evidence (2)
  • zizmor reported unpinned-uses · zizmor 1.28.0

    The code has a known weakness, though this scan does not show that anyone can exploit it here.

    Policy reason: zizmor-known-workflow-rule · Execution scope: automation

    Source: .github/workflows/release.yml:16

  • zizmor reported unpinned-uses · zizmor 1.28.0

    The code has a known weakness, though this scan does not show that anyone can exploit it here.

    Policy reason: zizmor-known-workflow-rule · Execution scope: automation

    Source: .github/workflows/package-current-release.yml:14

Contextual expected matches (46)

JavaScript analysis reported javascript.xray.sql-injection

Expected behavior · high confidence

The security scanner thought there might be an SQL injection risk, but this app doesn't use any SQL database. It's just a harmless log message about a character's outfit change.

Technical evidence

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

Contextual assessment: The static analysis flagged a sql-injection signal at line 21393. The context shows a console.warn with a template literal interpolating a detected outfit string. No SQL queries, database connections, or query construction exist anywhere in the provided evidence. The application uses IndexedDB and localStorage for persistence, not SQL. This is a false positive from pattern matching.

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.sql-injection
File role
production
Source
app.js:21393

JavaScript analysis reported javascript.xray.unsafe-vm-context

Expected behavior · high confidence

The code uses Node's built-in virtual machine to run small pieces of the app in a safe testing environment, like a sandbox for experimenting. This is how many tests work and does not create a security risk.

Technical evidence

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

Contextual assessment: The 'unsafe-vm-context' signal flags use of vm.runInNewContext. In this test file, vm is used with hardcoded application source slices and fixed test data to unit-test individual functions in isolation. No user-supplied or dynamically-fetched code is passed to vm. The sandbox context is a plain object and no dangerous capabilities are exposed. This is a standard testing pattern and does not represent a runtime attack vector.

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-vm-context
File role
production
Source
scratch/engine_audit.js:97

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

This file talks to AI models over the internet or a local server, which is exactly what the app is supposed to do. It does not run any downloaded code, so there's no hidden danger.

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 flagged a correlation between network retrieval (fetch calls) and dynamic code execution sinks, but the provided source code only uses fetch for OpenAI-compatible API calls to local or configured model endpoints. No eval, new Function, or other dynamic execution sink is present. The fetched response is used as text output, not executed. This is standard behavior for an LLM client and 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
labs-core.js:1-253

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This is part of a test that checks how the project handles certain keywords. It runs a small piece of the project's own code in a sandbox to see if it works correctly. It is not used during normal use of the application.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: Line 115 in the regression test file uses vm.runInNewContext to execute a function (parseLoreKeywords, loreKeywordMatches) extracted from the project's own application source, with a sandbox containing only Set, RegExp, and String. This is a unit test for the lore keyword parser. The executed code is project-authored, not user-supplied. The result is used only for assertion comparisons. No production impact.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/gameplay_overhaul_audit.js:115

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

This file stores a fictional world's characters, images, and settings as data. The scanner flagged the long image data strings, but they are just embedded pictures, not dangerous links.

Technical evidence

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

Contextual assessment: The file is a generated JavaScript data structure defining a persistent world for Horde Studio. It contains large inline base64-encoded media assets (data URIs) which are normal for this format. The 'shady-link' signal is a false positive triggered by the long data URI strings. No external URLs or network requests are present; the data is purely declarative and local.

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
policy-panic-world.js:2

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This line runs a test that checks how the project saves and restores game state. It runs a small piece of the project's own code in a sandbox to verify it behaves correctly. No outside data is used.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: Line 47 in the regression test file uses vm.runInNewContext to execute functions captureWorldTurnState and restoreWorldTurnState extracted from the project's own application source. The sandbox context is limited to structuredClone, JSON, a safeJsonClone helper, isPlainObject, and a stub bumpMemoryEpoch. The executed code is project-authored, not user-supplied. This is a standard testing pattern for isolated verification.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/gameplay_overhaul_audit.js:47

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

This test checks that a built-in character's photo is correctly embedded as a data URL. It doesn't connect to any website or download anything. The scanner warning is a false alarm.

Technical evidence

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

Contextual assessment: Line 36 asserts that a bundled virtual human's profilePhoto property starts with 'data:image/jpeg;base64,'. This is a data URI, not a network URL or shady link. The scanner flagged it as a 'shady-link' due to a heuristic that treats data: URIs as potentially suspicious. However, the test merely validates that the bundled character data contains an embedded base64-encoded JPEG image. No actual network request is made. This is safe expected behavior for test validation of bundled assets.

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
scratch/included_human_audit.js:36

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This is a test that runs a small piece of the app's code to check if it works correctly. It does not run any user-supplied code and only runs during development testing.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: This vm.runInNewContext call is part of a test suite (engine_audit.js) that slices application code to unit-test specific functions. The executed code is hardcoded string slices from the application bundle, not user or external input. The test context is a fresh empty object, and no runtime state is leaked. This is a standard Node.js testing pattern with no production exposure.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/engine_audit.js:125

JavaScript analysis reported javascript.xray.suspicious-literal

Expected behavior · high confidence

This signal appeared because the file has very long text strings inside, but that's normal for an AI roleplay preset — it's just saved prompts, not hidden code.

Technical evidence

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

Contextual assessment: The suspicious-literal signal was raised on a static preset definition file (file) that contains only data: an array of JSON-like system prompt objects with long text values. No obfuscation, dynamic execution, or hidden logic is present. The scanner likely flagged the large content as an unusual literal, but it is structurally identical to a data file for SillyTavern-adjacent preset systems.

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.suspicious-literal
File role
production
Source
presets.js:1

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

The security scanner flagged some code as suspicious, but it's actually just the character's built-in profile pictures stored as text. No external links or data theft 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: JS-X-Ray flagged 'shady-link' on the data:image/jpeg;base64 URIs embedded in the virtual-human character definition. These are inline base64-encoded JPEG images for the character's profile and base photos, not external URLs. No network request or credential exposure occurs from these data URIs. The scanner signal is a false positive in this context.

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
ashlyn-reynolds-human.js:5

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

Another test that runs app functions in a safe sandbox to verify they reject bad data. Only runs during development.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: Same pattern as prior candidate: vm.runInNewContext used to execute a hardcoded slice of application source to test validation functions. The string is composed from literal source slices via app.slice(), no dynamic input. No user or attacker influence. Part of the project's own security audit suite.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/engine_audit.js:135

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

The file contains a list of common local addresses for AI model servers. This is used to automatically find a running local model. It does not send data to the internet.

Technical evidence

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

Contextual assessment: The scanner identified hardcoded URLs (14 occurrences) but they are all localhost or private IP addresses used for auto-discovery of local model servers (e.g., Ollama, LM Studio). The normalizeLoopbackBase function validates that only private hosts are used. These URLs are not sent to external services; they are used to probe for local endpoints. This is expected for a local-first AI tool and does not represent a security concern.

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
labs-core.js:17

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

A test that checks if the game's travel rules work correctly. It runs inside the test runner, not in the live app.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: Third occurrence: vm.runInNewContext used to test travel logic. The executed code is built from functionSource() which extracts hardcoded function bodies from the application string. No external or untrusted data reaches the vm context. This is a unit test, not a production execution path.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/engine_audit.js:143

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This test checks a feature that rotates items in a large world to keep things manageable. It runs a small piece of the project's own code in a sandbox to make sure the rotation works as expected.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: Line 130 in the regression test file uses vm.runInNewContext to execute the rotatingWorldWindow function extracted from the project's own application source. The sandbox context is limited to Math, Number, Array. The executed code is project-authored, not user-supplied. This test verifies the rotation algorithm produces different orderings with different parameters.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/gameplay_overhaul_audit.js:130

JavaScript analysis reported javascript.xray.obfuscated-code

Expected behavior · high confidence

The scanner thought this file might be scrambled, but it's just a data file with long image strings. It's not hidden or malicious.

Technical evidence

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

Contextual assessment: The 'obfuscated-code' signal triggered due to the file's very long lines (base64 data URIs) and lack of typical formatting. However, the file is a generated data structure, not obfuscated code. The scanner confidence is low, indicating uncertainty. The normalized representation shows valid JavaScript object syntax with no obfuscation, minification, or hidden logic.

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.obfuscated-code
File role
production
Source
policy-panic-world.js:1

JavaScript analysis reported javascript.xray.obfuscated-code

Expected behavior · high confidence

This is a build script that prepares images and game data. It's not hiding anything; the code is easy to read and does exactly what it says.

Technical evidence

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

Contextual assessment: The script is a straightforward build tool that reads PNG assets, converts them to JPEG via the sharp library, and constructs a world file with embedded media. All code is clearly readable and serves its documented purpose. The scanner's obfuscated-code signal has low confidence and is not supported by the visible source—there is no concealment, encoding, or intentional obfuscation.

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.obfuscated-code
File role
production
Source
scratch/build_policy_panic_world.js:1

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This is the same safe test pattern as the other flag. It uses a sandbox to test app code without risking any harmful execution.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: The OpenGrep rule flags the same vm.runInNewContext call from the quest engine stress test. As analyzed in the companion assessment, this is a deliberate sandboxed test execution of a static code slice, not a dynamic eval of untrusted content. No security concern.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/quest_engine_stress_test.js:55-66

JavaScript analysis reported javascript.xray.unsafe-regex

Expected behavior · high confidence

This is a test file that uses a regular expression to check the app's own code. Since it never sees user input, it cannot be used to attack anyone.

Technical evidence

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

Contextual assessment: The regex is used solely in a test assertion that checks whether a hardcoded application source string contains a specific code pattern. It does not process any user-supplied or network-supplied input. Therefore the unsafe-regex pattern cannot be triggered by an attacker and poses no security risk.

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
scratch/authored_world_audit.js:172

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

The app uses fetch to talk to its local bridge and AI providers, and it updates the page using safe HTML escaping. There is no way for an attacker to make it run code from the network based on what we can see.

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 (network retrieval) with a code execution sink in the same file. The visible fetch calls are to the local MCP bridge (localhost:43127) or hardcoded provider API bases. The only dynamic DOM update is innerHTML with values escaped via escapeHTML, not arbitrary code execution. No eval, new Function, or similar execution of fetched content is present in the provided evidence.

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
app.js:456-8242

JavaScript analysis reported javascript.download-to-execution

Expected behavior · high confidence

The scanner thought there might be a path that downloads code and then runs it, but looking at the actual file, there is no network download happening. The code only runs pre-written test snippets. This is not a real vulnerability.

Technical evidence

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

Contextual assessment: The 'download-to-execution' correlation suggests a network retrieval primitive combined with a code execution sink in the same file. The supplied evidence shows no network function (fetch, http) in the visible code. The file is a test suite that uses vm.runInNewContext with static app source. There is no demonstrated path where remotely fetched data reaches a dynamic code execution sink. The correlation is a static-analysis artifact without runtime reachability.

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
scratch/engine_audit.js:97-419

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

This is a security test that checks Horde Studio blocks remote model endpoints. The flagged URL is just an example used in the test, not a real connection attempt.

Technical evidence

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

Contextual assessment: The JS-X-Ray shady-link signal flagged a line in a test file where a remote URL is used as an assertion input. The test explicitly verifies that remote cognition endpoints are normalized to localhost, confirming a security guard. No actual remote connection is made; the URL is a test argument.

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
scratch/labs_cognition_audit.js:44

JavaScript analysis reported javascript.xray.unsafe-vm-context

Expected behavior · high confidence

Detailed wording was omitted by the public report safety filter.

Technical evidence

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

Contextual assessment: The Node.js vm.runInNewContext call on line 47 is used within a project-internal regression test script to extract and execute a specific function from the project's own application code (file) in a sandboxed context. The executed code is a statically extracted substring of the project's own source, not user-controlled input. The sandbox context is limited to safe built-ins (structuredClone, JSON, a stub bumpMemoryEpoch). No untrusted data reaches the vm call, and the test has no runtime reachability in production browser execution. This is a standard testing pattern for isolated unit verification.

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-vm-context
File role
production
Source
scratch/gameplay_overhaul_audit.js:47

zizmor reported artipacked

Expected behavior · high confidence

This workflow builds and uploads the application. The token used to upload is temporary and not stored inside the uploaded file. There is no security issue here.

Technical evidence

Scanner reason: zizmor matched workflow-security rule artipacked. The match applies to this repository.

Contextual assessment: The zizmor artipacked rule flags potential credential persistence into GitHub Actions artifacts, but this workflow uses github.token only to upload a pre-built portable application zip to a release via gh. The token is not embedded into the artifact; it is an environment variable scoped and short-lived. No evidence of credential leakage or persistence exists in the supplied workflow source.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
zizmor 1.28.0
Rule
artipacked
File role
tooling
Source
.github/workflows/package-current-release.yml:13-16

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

A test that simulates launching a preset selector to ensure it picks a valid option. Only runs when the developers run tests.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: vm.runInNewContext is used with a hardcoded string template to test DEFAULT_SYSTEM_PRESETS initialization. The code is a known slice of the application's source. No untrusted input is involved. This is a development-time test.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/engine_audit.js:97

JavaScript analysis reported javascript.xray.unsafe-regex

Expected behavior · high confidence

This is a complex pattern used by the project's own test tools to clean up source code before checking it. It only runs on the project's own files, not on anything a user might type or send. There is no practical risk.

Technical evidence

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

Contextual assessment: The regex on line 193 is part of a test-utility function (constInitializerIsInert) that normalizes regex literals in static source code extracted from the project's own file file. The regex is used to replace JavaScript regex literals with a placeholder to prevent false positives in a subsequent call-detection scan. The input is the project's own source, not attacker-controlled data. No ReDoS risk is demonstrated because the input is controlled by the developer and is not dynamic or user-provided.

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
scratch/app_source.js:193

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

The app talks to several services like local model servers and cloud AI providers, which means it needs to reference many web addresses. All of them are expected for the app's features, not hidden or malicious.

Technical evidence

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

Contextual assessment: The shady-link signal flags 36 URL references across the codebase. All observed URLs connect to local loopback addresses for self-hosted services, well-known model provider endpoints, an open weather API, blob and data URIs for media handling, and SVG namespace constants. These matches are consistent with the project's stated purpose of connecting to local and cloud AI services and media providers. No evidence of unexpected destinations or credential exfiltration is present.

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
app.js:250

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

Another development test that checks the game clock doesn't go negative. Safe and only runs when testing.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: vm.runInNewContext used to test getWorldTimeData with a hardcoded function source slice. The context is a fresh object, input is hardcoded test values. No dynamic or untrusted data. Part of the unit test suite.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/engine_audit.js:240

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

This file stores images as long text strings. The scanner flagged them as suspicious links, but they are just embedded pictures for the world.

Technical evidence

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

Contextual assessment: The 'shady-link' signal is a false positive triggered by the long data URI strings present in this generated world data file. These data URIs are embedded JPEG images for NPC portraits and location backgrounds, not external URLs or network destinations. No runtime network requests are made from this file.

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
policy-panic-world.js:15

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

A test that verifies undoing a game turn doesn't break the world map. Only runs during development.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: vm.runInNewContext used to test turn snapshot restore functions. The code string is built from multiple hardcoded functionSource() calls joined together. The context object receives no external input. This is a development-only unit test ensuring snapshot logic doesn't corrupt shared world geography. No attacker-accessible path.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/engine_audit.js:249-256

JavaScript analysis reported javascript.xray.unsafe-vm-context

Expected behavior · high confidence

This is a test script that runs a chunk of the app's map code in a sandbox to make sure it works. No user data or secrets are involved, and the script only runs when the developer manually executes it.

Technical evidence

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

Contextual assessment: The file is a developer test script that runs a static slice of the application's world-map engine inside a Node.js VM context (vm.runInNewContext) for isolated regression and stress testing. The input string is constructed from hardcoded offsets and the file source file read at test start; no user-controlled or untrusted data is injected. The use of vm.runInNewContext is appropriate for this test isolation purpose and does not expose any production risk.

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-vm-context
File role
production
Source
scratch/world_map_stress_test.js:17-30

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

The scanner flagged 'data:image/jpeg;base64,...' as a suspicious link, but that's just how images are stored directly in the data — no external server is contacted. It's safe.

Technical evidence

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

Contextual assessment: The shady-link signal at line 33 in file points to the assertion: assert(ash.profilePhoto.startsWith('data:image/jpeg;base64,')). This is a data URI (embedded image), not an external link. The scanner interpreted the 'data:' prefix as a suspicious URL, but it's a legitimate inline image reference for a virtual human's profile photo. A similar assertion on the next line for basePhoto also triggers. No network request or data exfiltration is involved.

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
scratch/ashlyn_archive_audit.js:33

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

This file contains a character definition with a pre-loaded profile picture stored inside the code itself (a data URI). It does not connect to the internet or send data anywhere.

Technical evidence

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

Contextual assessment: The file defines a virtual human character object with embedded Base64 image data for profile photos, using data URIs. No external network calls or URLs are present in the provided source; the scanner signal 'shady-link' likely matched the data URI strings, which are static content storage, not actual network links. The file is a generated data artifact for the Horde Studio project.

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
jane-harlow-human.js:4

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This test checks how the project handles different statistics for characters, like health or agility. It runs a small piece of the project's own code in a sandbox to verify the default settings are correct.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: Line 84 in the regression test file uses vm.runInNewContext to execute the worldStatRollConfig function extracted from the project's own application source. The sandbox context is limited to isPlainObject. The executed code is project-authored, not user-supplied. This test verifies default stat roll configuration for different stat types.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/gameplay_overhaul_audit.js:84

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This is a test file that runs part of the app's map code inside a sandbox to check for bugs. It only runs when the developer tests manually and does not affect users.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: This candidate flags the same vm.runInNewContext call in the test file. The dynamic execution is limited to a predetermined slice of the application's own source code with no runtime user input. The test script is not shipped or executed in production; it is a developer-only artifact. No credential handling, exfiltration, or persistence is present. The behavior is standard for unit testing isolated functions.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/world_map_stress_test.js:17-30

zizmor reported artipacked

Expected behavior · high confidence

This workflow creates a release when a new version tag is pushed. It uses a temporary token to upload the application, but the token stays in the workflow environment and is not packed into the download. Safe.

Technical evidence

Scanner reason: zizmor matched workflow-security rule artipacked. The match applies to this repository.

Contextual assessment: The zizmor artipacked rule flags potential credential persistence into artifacts, but this workflow uses github.token only to create a release and upload the portable zip. The token is not written into the artifact. The workflow triggers only on tag pushes and has no artifact-storing steps beyond the release upload. No credential persistence is demonstrated.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
zizmor 1.28.0
Rule
artipacked
File role
tooling
Source
.github/workflows/release.yml:15-16

JavaScript analysis reported javascript.xray.obfuscated-code

Expected behavior · high confidence

The file is a character definition file with a pre-stored image. It is not hidden or scrambled; it's just data.

Technical evidence

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

Contextual assessment: The file is a generated data artifact (virtual human character definition) and its code is not obfuscated; it is a straightforward JSON-like object with named properties. The scanner signal 'obfuscated-code' is a low-confidence false positive likely triggered by the large inline base64 image strings, which are not obfuscation but static data.

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.obfuscated-code
File role
production
Source
jane-harlow-human.js:1

JavaScript analysis reported javascript.credential-to-network

Expected behavior · high confidence

The app reads which AI service you set up and sends your story text to that service. That is exactly what it's supposed to do. The credentials stay with your chosen provider.

Technical evidence

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

Contextual assessment: The scanner noted credential access (reading API base URLs from state.globalSettings) correlated with a network sink (fetch). The code reads base URLs for user-configured providers and makes fetch requests to those URLs. This is the intended behavior: the app sends prompts to the user's chosen AI provider. No evidence shows credentials being sent to an attacker-controlled destination or outside the configured provider endpoints.

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.credential-to-network
File role
production
Source
app.js:456-1475

JavaScript analysis reported javascript.xray.unsafe-vm-context

Expected behavior · high confidence

This test file carefully isolates a piece of the app's quest code in a sandbox to run unit tests. It only uses code already in the app and doesn't allow any outside input, making it safe.

Technical evidence

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

Contextual assessment: vm.runInNewContext is used in a test helper to extract a bounded portion of the application's quest engine code and execute it inside a sandboxed context with only safe stubs (console, showToast, utility functions). The source string is a fixed slice of file determined by start/end markers; no untrusted input is involved. This is a standard Node.js testing pattern and does not introduce runtime code injection risk.

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-vm-context
File role
production
Source
scratch/quest_engine_stress_test.js:55-66

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

This file contains automated tests for the app's companion system. The URLs and keys shown are test data, not real secrets or malicious links. They are used to verify that the app correctly connects to AI providers during development testing.

Technical evidence

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

Contextual assessment: The scanner flagged hardcoded URLs and API key patterns in a test file. The evidence shows unit tests for a companion module that validate provider configuration, image request construction, and authentication headers. All URLs point to test endpoints or documented provider base URLs; the API key strings are test placeholders. No production credential exfiltration or malicious network destination is present. The file's role is production but its content is exclusively test code, so the flagged patterns do not affect shipped 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.xray.shady-link
File role
production
Source
scratch/companion_audit.js:525

JavaScript analysis reported javascript.xray.obfuscated-code

Expected behavior · high confidence

The scanner thought the long text might be hidden code, but it's just a set of AI instructions stored as data — nothing dangerous.

Technical evidence

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

Contextual assessment: The obfuscated-code signal also fired on the same static data. The file contains only plain object literals and string content. No minification, encoding, or concealment is used. The scanner's low confidence further supports that this is a false positive.

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.obfuscated-code
File role
production
Source
presets.js:1

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

This is a test that checks whether the app's internal function extractor works correctly. It uses JavaScript's Function constructor on strings it already knows are safe, so there's no risk to users.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: The test file uses new Function() to validate that extracted function source strings parse correctly. This is a deliberate test-harness technique to verify the extractor produces syntactically valid JavaScript. No user or attacker-controlled input reaches this call; the source strings are statically derived from the application's own source code. This is not a vulnerability.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/extractor_audit.js:180

JavaScript analysis reported javascript.xray.prototype-pollution

Expected behavior · high confidence

The scanner thought there might be a way to mess with object internals, but the code actually protects against that. There's no actual issue here.

Technical evidence

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

Contextual assessment: The static analysis flagged a prototype-pollution signal at line 921. The context around that line shows object literal initialization (state defaults) and no assignment to __proto__, prototype, or constructor. The codebase includes defensive cloning (safeJsonClone) that strips prototype-pollution keys, and uses isPlainObject checks. No prototype pollution vulnerability is demonstrated.

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.prototype-pollution
File role
production
Source
app.js:921

JavaScript analysis reported javascript.xray.obfuscated-code

Expected behavior · high confidence

A security scanner thought the first line of the JavaScript code looked suspicious, but it's just a simple line that collects any errors that happen while the app runs. Nothing hidden or dangerous.

Technical evidence

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

Contextual assessment: JS-X-Ray flagged line 1 of file as obfuscated code, but the actual source shows a straightforward runtime error tracking assignment: window.__hordeRuntimeErrors = window.__hordeRuntimeErrors || [];. This is a common pattern for accumulating runtime errors, not obfuscation. The scanner confidence is low, and no obfuscated or concealed logic is visible in the supplied code.

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.obfuscated-code
File role
production
Source
app.js:1

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

The file holds a character profile with a built-in image. It does not make any internet connections.

Technical evidence

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

Contextual assessment: The file contains only static data URIs (base64 encoded images) and no external network URLs. The scanner signal 'shady-link' likely matched the data URI strings, which are not actual network links. The file is a character data definition for Horde Studio's virtual human feature.

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
jane-harlow-human.js:14

JavaScript analysis reported javascript.xray.shady-link

Expected behavior · high confidence

The security scanner flagged some code as suspicious, but it's actually just the character's built-in profile pictures stored as text. No external links or data theft 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: JS-X-Ray flagged 'shady-link' on the data:image/jpeg;base64 URIs embedded in the virtual-human character definition. These are inline base64-encoded JPEG images for the character's profile and base photos, not external URLs. No network request or credential exposure occurs from these data URIs. The scanner signal is a false positive in this context.

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
ashlyn-reynolds-human.js:14

OpenGrep reported tavernkeeper.dynamic-execution.javascript-eval

Expected behavior · high confidence

A test that makes sure user-generated text in chat gets properly cleaned up to prevent attacks. Only runs during testing.

Technical evidence

Scanner reason: OpenGrep matched static-analysis rule tavernkeeper.dynamic-execution.javascript-eval. The match applies to this repository.

Contextual assessment: Another vm.runInNewContext test: this one tests HTML escaping by executing the escapeHTML function in a sandbox. The input is a hardcoded test string. The context is isolated and no data persists. Standard unit test practice.

Impact: none · Exploitability: unlikely

Developer action: none

Scanner
opengrep 1.26.0
Rule
tavernkeeper.dynamic-execution.javascript-eval
File role
production
Source
scratch/engine_audit.js:115

Related contextual observations

Embedded base64 image data in character definition

low risk · high confidence

The flagged content is just the character's pictures stored as long text strings in the code. This is normal for offline-usable character files.

Technical assessment

The file contains two large data:image/jpeg;base64 strings representing the character's profile photo and base photo. These are standard for bundling images directly into code and do not interact with external servers. The scanner's 'shady-link' rule appears to have matched the 'data:' URI scheme, which is a false positive here.

Impact: none · Exploitability: unlikely

Developer action: none

Sources:

Embedded base64 image data in character definition

low risk · high confidence

The flagged content is just the character's pictures stored as long text strings in the code. This is normal for offline-usable character files.

Technical assessment

The file contains two large data:image/jpeg;base64 strings representing the character's profile photo and base photo. These are standard for bundling images directly into code and do not interact with external servers. The scanner's 'shady-link' rule appears to have matched the 'data:' URI scheme, which is a false positive here.

Impact: none · Exploitability: unlikely

Developer action: none

Sources:

Generated world data file with embedded media

low risk · high confidence

This is a data file automatically created by a build script. It contains all the images needed for a fictional world, stored directly in the code as long text strings.

Technical assessment

The file is generated by 'file' as indicated in the comment. It pushes a world definition object onto globalThis.HORDE_INCLUDED_WORLDS. All media (banner, NPC portraits, location backgrounds) are stored as inline data URIs. No runtime network calls, dynamic imports, or user input processing occur in this file.

Impact: none · Exploitability: unlikely

Developer action: none

Sources:

Both scanner signals are false positives on generated data

low risk · high confidence

Both scanner warnings are false alarms. The file is just a data file containing a fictional world's settings and images. It doesn't do anything except store information.

Technical assessment

Both signals arise from the same generated data file. The 'obfuscated-code' signal at line 1 and 'shady-link' signal at line 15 are artifacts of the file's generated nature: long base64 strings and a compact format. The normalized representation confirms standard JavaScript object syntax with no obfuscation, no external references, and no executable logic beyond defining a data structure. The file is safe and behaves as expected for a world definition.

Impact: none · Exploitability: unlikely

Developer action: none

Sources:

All vm.runInNewContext calls are from a development test suite

low risk · high confidence

The file is a set of automated tests that the developers run to catch bugs before releasing updates. They use a safe sandbox to run small parts of the app to check that everything works properly. This is normal and does not affect users.

Technical assessment

The entire file 'file' is a Node.js-based test harness (it uses assert, test() registration, and runs via a test runner). Every vm.runInNewContext call executes hardcoded substrings of the application 'app' variable, which is itself a concatenation of the production JavaScript bundle. The tests are run during CI or local development, not shipped to users. No dynamic input from users or external sources reaches the vm context. This pattern is standard for sandboxed unit testing of JavaScript logic. The project's security posture is reinforced by these tests, which explicitly verify CSP, escaping, and data validation.

Impact: none · Exploitability: unlikely

Developer action: none

Sources:

All vm.runInNewContext calls in group 2 are also from the same test suite

low risk · high confidence

More automated tests that check game mechanisms like time and save/restore. Only developers see these tests.

Technical assessment

Continues the pattern from group 1. Both candidates are additional unit tests in the same audit file. They execute hardcoded slices of the application JavaScript to validate world time calculation and turn snapshots. No user or attacker influence reaches the vm context. The tests are not part of the shipped application.

Impact: none · Exploitability: unlikely

Developer action: none

Sources:

Coverage and limitations

JavaScript coverage

Unresolved JavaScript stages

Tools

Limitations

Technical scan identity