Install verification: runtime verified (L5) · tested on dsh 0.2.1-rc.2 · last checked Install verification details →
What it does
Open your DeepSeek Harness desktop Web UI from your phone over your own Tailscale tailnet — one switch, no port forwarding, no public exposure.
Installation
dsh plugin --profile web add github:kjx-talesofai/dsh-plugin-tailscale-remote#v0.2.5Install method: GitHub · 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 |
|---|---|
| v0.2.5 | ✓ |
v0.2.5github✓ 1 runtime-verified2026-10-20
https://github.com/kjx-talesofai/dsh-plugin-tailscale-remote
✓dsh 0.2.1-rc.2current2026-10-20L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-rc.2
- • Plugin artifact: github · https://github.com/kjx-talesofai/dsh-plugin-tailscale-remote#v0.2.5
ID: dsh-plugin-tailscale-remote@v0.2.5@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.
Author badges
Embed the official badges in your README to showcase security & install-test status:
`[](https://www.dsh.so/artifact/dsh-plugin-tailscale-remote/)``[](https://www.dsh.so/artifact/dsh-plugin-tailscale-remote/)`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 low — stricter wins → overall low.
v0.2.5dsh manifestv0.2.5git2026-10-21v0.2.5same versionclean · gitVet is an AST static scan (npm artifact or git source).
show static findings (8)
- warningchildProcessImport · code-exec
lib/index.js:21import { execFile } from 'node:child_process' - warningnetIp · network
lib/index.js:382if (value?.Handlers?.['/']?.Proxy === `http://127.0.0.1:${String(port)}`) return true - warningnetIp · network
lib/index.js:395return new URL(ctx.connection.authenticatedUrl('http://127.0.0.1/')).searchParams.get('token') ?? '' - warningnetIp · network
lib/index.js:598if (occupant !== null && occupant !== `http://127.0.0.1:${String(port)}`) { - warningchildProcessImport · code-exec
src/index.js:21import { execFile } from 'node:child_process' - warningnetIp · network
src/index.js:382if (value?.Handlers?.['/']?.Proxy === `http://127.0.0.1:${String(port)}`) return true - warningnetIp · network
src/index.js:395return new URL(ctx.connection.authenticatedUrl('http://127.0.0.1/')).searchParams.get('token') ?? '' - warningnetIp · network
src/index.js:598if (occupant !== null && occupant !== `http://127.0.0.1:${String(port)}`) {
show 2 audit findings
- lowRuntime trustedHosts mutation can leave stale/over-broad authorities after errors or hostname changes
lib/index.js:438registerTrustedAuthority() appends the tailnet hostname to ctx.connection.trustedHosts, which is the harness's Host/Origin fence for /api. unregisterTrustedAuthority() only removes the single name stored in injectedAuthority and is only called on the explicit disable path; every error path after registration (e.g. serve.portBusy, fence.selfCheck, the generic catch in reconcile) and every hostname change while enabled leaves the previous authority trusted until process restart. The widened fence is not itself an exploit (session token/admit still required), but it silently keeps DNS-rebinding-s
- lowInjected __DSH_TRANSPORT__ bootstrap globally overrides the harness's memory-persistence policy for remote pages
lib/index.js:184The tap registered with webServer.tapIndex runs on every served HTML page and flips the settings client from the framework's deliberate `memory` persistence (used for non-loopback pages) to host-backed writes. This is broader than the plugin's own panel: any authenticated remote session (pairing tokens are valid for a long time) can now persist configuration changes of any settings form through the harness UI. Impact depends on how the host's settings API authorizes non-loopback sessions, which is outside the harvested code.
Hardened Tailscale remote-access plugin: token routes go through connection.admit, pairing is code-gated/rate-limited, no shell exec; only two low-severity policy gaps found.
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-17 · activity: Active
• Repo created: 2026-10-05
• Stars: ★ 1 · Forks: 0
• Health: Active — committed within last 30 days
Source
GitHub: github.com/kjx-talesofai/dsh-plugin-tailscale-remote
Author README
View on GitHub ↗The author's original README from the repository — fetched live, unedited (the English page loads the default README).
