Install verification: runtime verified (L5) · tested on dsh 0.2.1-rc.2 · last checked Install verification details →
What it doesAI
Lets you run local GGUF models via llama.cpp from a Web GUI, with model picker, live VRAM estimate, and one-click provider registration.
- In-app file browser for .gguf selection
- Header-only GGUF metadata parser (architecture, quant, MoE)
- Live VRAM estimate and launch via llama server
Capability tags are AI-inferred or rule-extracted from the README (see badge) — vocabulary-limited, not install-verified. AI = inferred; README = literal keyword from the readme.
Installation
dsh plugin --profile web add dsh-local-modelsInstall method: npm · runtime verified (L5)
Verification & Compatibility
Grouped by plugin version: each card lists the dsh versions actually tested against that artifact version and their install verdicts (L5 wins). Untested combinations are omitted — absence means untested, never assumed compatible. L1–L3 are a plugin-level static archive (independent of the dsh version — the same verdict on every dsh row): they sit in each row's level grid next to L4/L5, marked "static", while their evidence is stored once per plugin inside that row's "checks & evidence" instead of being duplicated per version.
External credentials (plugin-level): none detected
○ The author declares no dsh version requirement — install is not blocked by version.
| plugin \ dsh | dsh 0.2.1-rc.2 current | dsh 0.2.1-alpha.4 | dsh 0.2.1-alpha.2 | dsh 0.2.0-rc.2 | dsh 0.2.0-rc.1 |
|---|---|---|---|---|---|
| 0.5.0 | ✓ | ✓ | · | · | · |
| 0.4.0 | · | · | ✓ | ✓ | · |
| v0.3.0 | · | · | · | · | · |
0.5.0npm✓ 2 runtime-verified2026-10-20
dsh-local-models
✓dsh 0.2.1-rc.2current2026-10-20L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-rc.2
- • Plugin artifact: npm · dsh-local-models@0.5.0
ID: dsh-local-models@0.5.0@dsh0.2.1-rc.2 · profile: l4-sandbox
Issued: 2026-10-20 · expires: 2026-10-27
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.2.1-alpha.42026-10-15L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.4
- • Plugin artifact: npm · dsh-local-models@0.5.0
ID: dsh-local-models@0.5.0@dsh0.2.1-alpha.4 · profile: l4-sandbox
Issued: 2026-10-15 · expires: 2026-10-22
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
0.4.0npm✓ 2 runtime-verified2026-10-12
dsh-local-models
✓dsh 0.2.1-alpha.22026-10-12L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.2
- • Plugin artifact: npm · dsh-local-models@0.4.0
ID: dsh-local-models@0.4.0@dsh0.2.1-alpha.2 · profile: l4-sandbox
Issued: 2026-10-12 · expires: 2026-10-19
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.2.0-rc.22026-10-09L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.0-rc.2
- • Plugin artifact: npm · dsh-local-models@0.4.0
ID: dsh-local-models@0.4.0@dsh0.2.0-rc.2 · profile: l4-sandbox
Issued: 2026-10-09 · expires: 2026-10-16
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
v0.3.0github✓ 1 runtime-verified2026-10-04
https://github.com/Vmarcelo49/dsh-local-models
✓prehistory2026-10-04L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: unknown
- • Plugin artifact: github · https://github.com/Vmarcelo49/dsh-local-models#v0.3.0
ID: dsh-local-models@v0.3.0@dshunknown · profile: l3-fullscan
Issued: 2026-10-04 · expires: 2026-10-11
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
Only the latest 3 published versions are shown; source-snapshot (commit hash) groups, unstated groups and older versions are omitted — the full archive stays in the data layer (snapshot/unstated groups appear only when a plugin has no published version).
Author badges
Embed the official badges in your README to showcase security & install-test status:
`[](https://www.dsh.so/artifact/dsh-local-models/)``[](https://www.dsh.so/artifact/dsh-local-models/)``[](https://www.dsh.so/artifact/dsh-local-models/)``[](https://www.dsh.so/artifact/dsh-local-models/)``[](https://www.dsh.so/artifact/dsh-local-models/)``[](https://www.dsh.so/artifact/dsh-local-models/)``[](https://www.dsh.so/artifact/dsh-local-models/)`Security Report
Two automated layers, neither a manual review: a static scan (per-plugin rule checks) and a model-driven dynamic security audit that covers only the subset static-flagged at warn or above and never executes plugin code.
Static low, dynamic medium — stricter wins → overall medium.
v0.5.0dsh manifest0.5.0npm2026-10-210.5.0same versionclean · npmVet is an AST static scan (npm artifact or git source).
show static findings (6)
- criticalshellExec · shell
lib/index.js:1038pids = execSync("lsof -ti :" + PORT, { encoding: "utf8" }).trim(); - warningchildProcess · code-exec
lib/index.js:1754const next = spawn(info.bin, args, { - warningshellExec · shell
lib/index.js:753execFile(file, args, { encoding: "utf8", ...opts }, (err, stdout, stderr) => { - warningnetIp · network
lib/index.js:985const res = await fetch("http://127.0.0.1:" + PORT + "/health", { - warningnetIp · network
lib/index.js:1890const res = await fetch("http://127.0.0.1:" + PORT + "/models", { signal: AbortSignal.timeout(1500) }); - warningnetIp · network
lib/index.js:2089baseURL: "http://127.0.0.1:" + st.port + "/v1",
show 3 audit findings
- mediumFile-path guard is a no-op: the filesystem root is always an allowed root
lib/index.jsBecause r === FILESYSTEM_ROOT short-circuits, isPathAllowed() returns true for every absolute path, so the checks in /local-models/browse, /local-models/gguf-meta, /local-models/run and normalizeProfileConfig never reject anything: the documented error 'this tab may not read that path' is unreachable. Any caller of the dsh webserver route can enumerate arbitrary directories (dir=/&all=1) and feed arbitrary files to the GGUF parser (whose error message echoes the first 4 bytes of the file), i.e. host filesystem metadata disclosure and unconfined model-path input. The plugin adds no authenticati
- lowUnvalidated newlines in profile path/id are concatenated into the router presets INI
lib/index.jsA saved profile whose modelPath (or, for an externally edited profiles.json, whose id) contains a newline injects extra lines/sections into $DSH_HOME/local-models/router-presets.ini, which is then handed to llama-server via --models-preset. This corrupts the router configuration (e.g. injecting keys such as a different bind address) for POST /local-models/router/start. Precondition is real but narrow: the injected path must name an existing file and the store is normally written by this plugin.
- lowstop() SIGTERMs any process listening on the configured port, not only the plugin's child
lib/index.jsPOST /local-models/stop with no tracked child first probes the port and then kills (SIGTERM) every pid returned by lsof on that port, excluding only the plugin's own pid. On the default port 8080 that can terminate an unrelated local service. There is no command injection here: PORT is parsed and clamped to 1..65535 at import and the rest of the command string is constant.
Heuristic execSync critical is a false positive (PORT is a validated int). Residual: file routes are effectively unconfined (root in allowedRoots) and stop() can SIGTERM any process on the port.
Rule: the dynamic audit can only raise risk, never lower it (raise-only, never an exemption); a wrong raise is withdrawn by human review and the tier falls back to the static verdict. Overall verdict = the stricter of the two layers.
Disclaimer: the static scan and the dynamic security audit are both automated analysis, not a security guarantee. Always review what you install.
Activity
Last commit 2026-10-03 · activity: Active
• Repo created: 2026-09-05
• Stars: ★ 0 · Forks: 0
• Health: Active — committed within last 30 days
Source
Author README
View on GitHub ↗The author's original README from the repository — fetched live, unedited (the English page loads the default README).
